c++ - 如何向 QWidget 添加插槽?

标签 c++ qt signals-slots

我有一个 QMainWindow,它有一个 QAction,其信号 triggered() 连接到插槽 about2()

...
connect(mAboutAction2, SIGNAL(triggered()), this, SLOT(about2()));
...


void occQt::about2()  //UI
{
    QWidget* pWidget = new QWidget;
    QPushButton* okbtn = new QPushButton(tr("ok"));
    QPushButton* cancelbtn = new QPushButton(tr("cancel"));
    btnlayout->addWidget(okbtn);
    btnlayout->addWidget(cancelbtn);
    dlglayout->setMargin(50);
    dlglayout->addLayout(gridlayout);
    dlglayout->addStretch(40);
    dlglayout->addLayout(btnlayout);
    pWidget->setLayout(dlglayout);
    pWidget->setWindowTitle(tr("Make a Box by custom."));
    pWidget->show();
    connect(okbtn, SIGNAL(clicked()), pWidget, SLOT(make_a_box()));
    connect(cancelbtn, SIGNAL(clicked()), pWidget, SLOT(close()));
}

void occQt::make_a_box()
{
    TopoDS_Shape aTopoBox = BRepPrimAPI_MakeBox(3.0, 4.0, 95.0).Shape();
    Handle_AIS_Shape anAisBox = new AIS_Shape(aTopoBox);

    anAisBox->SetColor(Quantity_NOC_AZURE);

    mContext->Display(anAisBox);
}

当我运行插槽 about2() 时,UI 打开。当我点击cancelbtn时可以关闭它,但是我无法进入插槽make_a_box()

我在哪里可以添加这个槽以使这个代码工作?

最佳答案

这没问题并且运行良好,因为您使用的插槽位于正确的位置:在您的 occQt 类中。

// You connect the signal FROM the action TO "this", i.e. your class
connect(mAboutAction2, SIGNAL(triggered()), this, SLOT(about2()));

void occQt::about2()  //UI
{

    QWidget* pWidget = new QWidget;
    QPushButton* okbtn = new QPushButton(tr("ok"));
    QPushButton* cancelbtn = new QPushButton(tr("cancel"));
    btnlayout->addWidget(okbtn);
    btnlayout->addWidget(cancelbtn);
    dlglayout->setMargin(50);
    dlglayout->addLayout(gridlayout);
    dlglayout->addStretch(40);
    dlglayout->addLayout(btnlayout);
    pWidget->setLayout(dlglayout);
    pWidget->setWindowTitle(tr("Make a Box by custom."));
    pWidget->show();

现在,这不行:

 // You connect the signal FROM the button to pWidget, which doesn't have a slot make_a_box()
 connect(okbtn, SIGNAL(clicked()), pWidget, SLOT(make_a_box()));

插槽 make_a_box() 对于 pWidget 不存在,它是一个 QWidget。您正在尝试将信号连接到不存在的插槽。

你必须在你的occQt类中定义这个插槽,并将按钮的信号clicked()连接到你类中的插槽 :

// Now, you connect the signal FROM the button to "this", which is your class and has a slot make_a_box()
connect(okbtn, SIGNAL(clicked()), this, SLOT(make_a_box()));

在您的 .h 文件中,您将拥有:

private slots : 
    void make_a_box();

在你的 .cpp 文件中:

void occQt::make_a_box()
{
    TopoDS_Shape aTopoBox = BRepPrimAPI_MakeBox(3.0, 4.0, 95.0).Shape();
    Handle_AIS_Shape anAisBox = new AIS_Shape(aTopoBox);

    anAisBox->SetColor(Quantity_NOC_AZURE);

    mContext->Display(anAisBox);
}

关于c++ - 如何向 QWidget 添加插槽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37385409/

相关文章:

c# - 如何在 Web 应用程序中使用 native 库方法?

c++ - std::lock()定义不正确,无法实现还是没用?

c++ - 在 if 参数中调用 bool 函数

linux - Linux 上的 Qt 4.8.3 GUI 应用程序看起来很旧并且与设计器预览不匹配

qt - 如何在PyQt4中为QTreeWidget实现itemChecked和itemUnchecked信号?

Qt - 调用小部件父的插槽

c++ - C++中两个线程的互斥量

c++ - 如何在 QWidget 中获取样式表更改事件?

c++ - 如何使用 QT RegExp 从字符串中提取子字符串列表

c++ - 从 Qt 中的类调用槽