首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >返回QDialog::exec()的返回值总是QDialog::Rejected

返回QDialog::exec()的返回值总是QDialog::Rejected
EN

Stack Overflow用户
提问于 2017-03-02 13:56:19
回答 1查看 3.4K关注 0票数 2

我有一个从AlarmSetup派生出来的对话框QDialog,其按钮排列如下:

代码语言:javascript
运行
复制
// 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()的返回代码:

代码语言:javascript
运行
复制
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");
...
}

res总是QDialog::拒绝,独立于我在AlarmSetup中单击的哪个按钮!对应的按钮分别是标准按钮QDialogButtonBox::Ok和QDialogButtonBox::Cancel,对应的信号信号(接受())和信号(拒绝()),所以我不明白为什么返回值是错误的!

请注意,对话框AlarmSetup正在按预期工作。

有什么办法可以让返回值生效吗?

谢谢您抽时间见我。

以下是slotOK()的代码

代码语言:javascript
运行
复制
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();
}
EN

回答 1

Stack Overflow用户

发布于 2017-03-02 14:36:28

调用accept();reject();而不是close()。拒绝只是默认值(如按ESC键)。

更改插槽以返回所需的值。

更新:

这对我来说很管用:

Mainwindow (删除不相关方法):

代码语言:javascript
运行
复制
void MainWindow::openDialog()
{
    Dialog* dialog = new Dialog();
    dialog->setModal(true);
    int result = dialog->exec();
    qDebug()<<"Result:"<<result;
}

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

代码语言:javascript
运行
复制
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()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42557377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档