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();
}
注:
通常最好在显示对话框之前设置所有连接,以防在您建立连接之前触发信号。这就是我将 show
语句移到最后的原因。
你可以替换这两个语句:
messageBox.setModal(true);
messageBox.show();
与
messageBox.exec();
结果是一样的。
最后,
QMessageBox
带有许多用于通用目的的静态函数。问题中显示的代码完全适合标准用例之一,因此可以使用以下内容重写所有内容:
if (QMessageBox::question(nullptr, "Confirmation", "Remove?",
QMessageBox::Ok | QMessageBox::Cancel,
QMessageBox::Cancel) == QMessageBox::Ok)
{
a1();
}
为什么这段代码没有调用所需的插槽?
在过去的 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();
}
注:
通常最好在显示对话框之前设置所有连接,以防在您建立连接之前触发信号。这就是我将
show
语句移到最后的原因。你可以替换这两个语句:
messageBox.setModal(true);
messageBox.show();
与
messageBox.exec();
结果是一样的。
最后,
QMessageBox
带有许多用于通用目的的静态函数。问题中显示的代码完全适合标准用例之一,因此可以使用以下内容重写所有内容:
if (QMessageBox::question(nullptr, "Confirmation", "Remove?",
QMessageBox::Ok | QMessageBox::Cancel,
QMessageBox::Cancel) == QMessageBox::Ok)
{
a1();
}