QT signal slot not working

时间:2015-07-31 20:31:12

标签: qt signals-slots qt4.7

Why this code does not call the desired slot?

I have trying to make it work for the last 3 hours!

void TForm::on_clicked( bool checked )
{
    QMessageBox *messageBox = new QMessageBox(this);
    QPushButton *buttonAccept0 = new QPushButton("OK", messageBox);
    QPushButton *buttonReject = new QPushButton("Cancel", messageBox);
    messageBox->addButton(buttonAccept0, QMessageBox::ButtonRole::AcceptRole);
    messageBox->addButton(buttonReject, QMessageBox::ButtonRole::NoRole);
    messageBox->setWindowTitle("Confirmation");
    messageBox->setText("Remove?");
    messageBox->setModal(true);
    messageBox->show(); 
    QObject::connect(buttonAccept0, SIGNAL(accepted()), this, SLOT(a1()));
}
void TForm::a1()
{
    std::string ff = "";
}

1 个答案:

答案 0 :(得分:1)

关于你的问题,有三点值得注意:

首先,您的错误是由于您使用了错误的信号(正如其他成员已经提到的那样)。

要更正错误,请对代码进行以下更改:

QObject::connect(buttonAccept0, SIGNAL(clicked()), this, SLOT(at()));

其次,与他/她的回答中提到的@ M74不同,完全允许在on_clicked函数内声明消息框和信号。 @ M74的原因是由于潜在的内存泄漏,但是Qt有一种机制可以用父母的形式来克服它,你在函数开头定义了消息框就可以正确地做到这一点。

不幸的是,@ M74的担忧并非完全没有根据,因为只有在父母被销毁时才会销毁消息框。

如果您的TForm实例在整个应用程序期间保持活动状态,并且多次执行on_clicked,则会创建许多messageBox实例并在后台等待删除,一种内存泄漏本身。

避免这种情况的更好方法是修改代码,使messageBox成为函数本地的堆栈变量。这两个QPushButton实例仍然可以在堆内存中创建,因为它们会在消息框被销毁时自动销毁,再次由于父母而被破坏。

void TForm::on_clicked(bool checked)
{
    QMessageBox messageBox;
    QPushButton *buttonAccept0 = new QPushButton("Ok", &messageBox);
    QPushButton *buttonReject = new QPushButton("Cancel", &messageBox);
    messageBox.addButton(buttonAccept0, QMessageBox::AcceptRole);
    messageBox.addButton(buttonReject, MessageBox::NoRole);
    messageBox.setWindowTitle("Confirmation");
    messageBox.setText("Remove?");
    messageBox.setModal(true);
    connect(buttonAccept0, SIGNAL(clicked()), this, SLOT(a1()));
    messageBox.show();
}

注意:

  1. 在显示对话框之前设置所有连接通常是个好主意,以防在建立连接之前发出信号。这就是我将show语句移到最后的原因。

  2. 您可以替换这两个语句:

    messageBox.setModal(true);

    messageBox.show();

  3.     messageBox.exec();
    

    结果将是相同的。

    最后,

    QMessageBox附带了许多用于常见目的的静态函数。问题中显示的代码非常适合其中一个标准用例,因此可以使用以下内容重写所有内容:

    if (QMessageBox::question(nullptr, "Confirmation", "Remove?", 
        QMessageBox::Ok | QMessageBox::Cancel, 
        QMessageBox::Cancel) == QMessageBox::Ok)
    {
        a1();
    }