将参数从QtMessageBox信号传递到buttonClick信号处理程序插槽

时间:2016-10-31 23:32:26

标签: c++ qt

我正在尝试创建一个弹出窗口,它将(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";
    }
}

1 个答案:

答案 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();