QT信号槽不工作

QT signal slot not working

为什么这段代码没有调用所需的插槽?

在过去的 3 个小时里,我一直在努力让它发挥作用!

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 = "";
}

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


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

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

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

其次,与his/her回答中提到的@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();

    messageBox.exec();

结果是一样的。


最后,

QMessageBox 带有许多用于通用目的的静态函数。问题中显示的代码完全适合标准用例之一,因此可以使用以下内容重写所有内容:

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