QDialog::exec() 的返回值始终为 QDialog::Rejected

3
我有一个名为AlarmSetup的对话框,继承自QDialog,并且按钮排列如下:
// button box
buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel |ButtonBox::Help, Qt::Horizontal, this);
buttonBox->button(QDialogButtonBox::Ok)->setText("übernehmen");
buttonBox->button(QDialogButtonBox::Cancel)->setText("abbrechen");
buttonBox->button(QDialogButtonBox::Help)->setText("Hilfe");
connect(buttonBox, SIGNAL(accepted()), this, SLOT(slotOk()));
connect(buttonBox, SIGNAL(rejected()), this, SLOT(slotCancel()));
connect(buttonBox, SIGNAL(helpRequested()), this, SLOT(slotHelp()));

在第二个对话框 AlarmWindow 中,我有一个名为 AlarmWindow::slotOpen() 的槽函数,在其中我正在创建一个新的 AlarmSetup 实例并评估 AlarmSetup::exec() 的返回代码:

void AlarmWindow::slotOpen()   // we create a new instance of AlarmSetup
{
if ( DBG_ALARM ) qDebug() << "AlarmWindow::slotOpen() triggered";

int alarmId = mAlarm.getAlarmIdFromAlarmMap( objectName() );
AlarmData alarmData = mAlarm.mAlarmMap.value( alarmId );
//qDebug() << "alarmData:" << alarmData << "| alarmId:" << alarmId;

AlarmSetup* alarmSetup = new  AlarmSetup( mAlarm, alarmData, alarmId );
int res = alarmSetup->exec();
qDebug() << "AlarmWindow -> AlarmSetup() returned:" << (res==QDialog::Accepted? "QDialog::Accepted":"QDialog::Rejected");
...
}

无论我在AlarmSetup中点击哪个按钮,res始终为QDialog::Rejected!对应的按钮分别是标准按钮QDialogButtonBox::Ok和QDialogButtonBox::Cancel,对应的信号分别是SIGNAL(accepted())和SIGNAL(rejected()),因此我不明白为什么返回值是错误的!
请注意,对话框AlarmSetup的工作正常。

有没有解决方案使返回值res正常工作?

感谢您的时间。

这是slotOK()的代码:

void AlarmSetup::slotOk()
{
if (DBG_ALARM) qDebug() << "AlarmSetup::slotOk() triggered";

QTime time = timeBox->time();
time.addSecs(60);                                                   // next full minute
time.setHMS( time.hour(), time.minute(), 0 );
AlarmData alarmData( alarmActiveBox->isChecked()
                   , QDateTime( calendar->selectedDate(), time )
                   , titleBox->text()
                   , textBox->document()->toPlainText()
                   , alarmSound->isChecked()
                   , alarmSoundBox->text()
                   , alarmRepeatActive->isChecked()
                   , numBox->text().toInt()
                   , unitBox->currentText()
                   , mFileName );

//qDebug() << "data from Setup:" << alarmData;
emit signalSetAlarm( alarmData, mAlarmId );

close();
}

你对 slotOk 的实现是什么? - king_nak
也许这篇帖子可以帮到你:https://dev59.com/MWcs5IYBdhLWcg3w7IQ9 - Dimitri Bosteels
@Dimitri - Jens A. Koch 提出的解决方案正是我所做的! - Alain Weiler
1个回答

3
请使用accept();reject();而不是close()。拒绝是默认值(例如按ESC键)。
将您的插槽更改为返回所需的值。 更新: 对我来说,这很有效:
MainWindow(删除了不相关的方法):
void MainWindow::openDialog()
{
    Dialog* dialog = new Dialog();
    dialog->setModal(true);
    int result = dialog->exec();
    qDebug()<<"Result:"<<result;
}

对话框(删除了不相关的方法):

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);

    buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this);
    buttonBox->button(QDialogButtonBox::Ok)->setText("übernehmen");
    buttonBox->button(QDialogButtonBox::Cancel)->setText("abbrechen");
    connect(buttonBox, SIGNAL(accepted()), this, SLOT(slotOk()));
    connect(buttonBox, SIGNAL(rejected()), this, SLOT(slotCancel()));
}

void Dialog::slotOk()
{
    accept();
    //close();
}

void Dialog::slotCancel()
{
    reject();
}

使用close()代替accept()时,我也收到了0的结果。这可能是因为按钮框中没有获得正确的角色,不确定。您是否覆盖了QDialog::exec()QDialog::accept()

我已按照建议进行了更改,但返回的代码仍然始终为0。 在我看来,操作类型应符合按钮类型和其发出的信号,而不是所调用的槽的名称。 - Alain Weiler
文档也反映了这个观点,请参见enum QDialogButtonBox :: StandardButton。 - Alain Weiler
现在它已经按预期工作了。我调用了我的槽 accept() 和 reject(),而不是将这些函数添加到我的槽中。我错了。非常感谢,Sebastian! - Alain Weiler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接