我正在尝试创建一个弹出窗口,它将(1)是非模态的,(2)携带上下文数据,稍后当用户单击ok事件时将处理这些数据。到目前为止,我有下面的代码,它会弹出一个非模态。我知道msgBox->open(this, SLOT(msgBoxClosed(QAbstractButton *))
和msgBoxClosed(QAbstractButton *button)
可以工作,但是当我将QStringList collisionSections
添加到SLOT参数时。我收到这个错误:
QObject::connect: No such slot MainWindow::msgBoxClosed(QAbstractButton *, collisionSections) in src\mainwindow.cpp:272
QObject::connect: (receiver name: 'MainWindow')
我理解,因为它在那里声明了SLOT,但我不知道如何去做我想要的东西,它将QString作为内容传递给我的信号并使它与buttonClicked一起发挥良好( )qmessagebox抛出OK点击的事件。我也可能以错误的方式接近这个,如果是的话请告诉我。非常感谢任何帮助!
void MainWindow::do_showCollisionEvt(QStringList collisionSections)
{
QString info = "Resolve sections";
for (QString section : collisionSections)
{
if (!section.isEmpty())
{
info.append(" [" + section + "] ");
qDebug() << "Emitting node off for:" << section;
emit nodeOff(section);
}
}
QMessageBox *msgBox = new QMessageBox;
msgBox->setAttribute(Qt::WA_DeleteOnClose);
msgBox->setText("Collision event detected!");
msgBox->setInformativeText(info);
msgBox->setStandardButtons(QMessageBox::Ok);
msgBox->setDefaultButton(QMessageBox::Ok);
msgBox->setModal(false);
msgBox->open(this, SLOT(msgBoxClosed(QAbstractButton *, collisionSections)));
}
void MainWindow::msgBoxClosed(QAbstractButton *button, QStringList collisionSections) {
QMessageBox *msgBox = (QMessageBox *)sender();
QMessageBox::StandardButton btn = msgBox->standardButton(button);
if (btn == QMessageBox::Ok)
{
for (QString section : collisionSections)
{
if (!section.isEmpty())
{
qDebug() << "Emitting nodeON for:" << section;
emit nodeOn(section);
}
}
}
else
{
throw "unknown button";
}
}
答案 0 :(得分:0)
首先,open()将您的插槽连接到没有参数的finished()信号,或者如果第一个插槽参数是指针(您的情况),则连接到buttonClicked()信号。
二。你没有正确地传递参数。您无法在声明期间执行此操作,插槽接收的参数将在信号发射中设置,在您的情况下,您无法控制。在SLOT中你只能声明参数TYPES而不是它们的值(注意SLOT只是一个宏,实际上SLOT(...)的结果只是一个字符串(char *))。
我建议你在消息框中使用setProperty()方法,例如:
msgBox->setModal(false);
msgBox->setProperty("collisionSections", collisionSections);
msgBox->open(this, SLOT(msgBoxClosed(QAbstractButton *)));
你的插槽可能就像那样:
void MainWindow::msgBoxClosed(QAbstractButton *button) {
QMessageBox *msgBox = (QMessageBox *)sender();
QStringList collisionSections = msgBox->property("collisionSections").toStringList();