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 = "";
}
答案 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();
}
注意:
在显示对话框之前设置所有连接通常是个好主意,以防在建立连接之前发出信号。这就是我将show
语句移到最后的原因。
您可以替换这两个语句:
messageBox.setModal(true);
messageBox.show();
与
messageBox.exec();
结果将是相同的。
最后,
QMessageBox
附带了许多用于常见目的的静态函数。问题中显示的代码非常适合其中一个标准用例,因此可以使用以下内容重写所有内容:
if (QMessageBox::question(nullptr, "Confirmation", "Remove?",
QMessageBox::Ok | QMessageBox::Cancel,
QMessageBox::Cancel) == QMessageBox::Ok)
{
a1();
}