2017-03-02 7 views
0

I einen Dialog AlarmSetup von QDialog mit folgenden Tastenanordnung abgeleitet habe:Rückgabewert von QDialog :: exec() immer QDialog :: Zurückgewiesen

// 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())); 

Von einem zweiten Dialog AlarmWindow, habe ich einen Schlitz AlarmWindow :: slotOpen(), in dem ich eine neue Instanz von AlarmSetup Erstellung und den Return-Code von AlarmSetup Auswertung :: 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"); 
... 
} 

res ist QDialog immer :: abgelehnt, independly die Schaltfläche geklickt ich in AlarmSetup! Die entsprechenden Buttons sind Standard-Button QDialogButtonBox :: Ok und QDialogButtonBox :: Cancel jeweils die entsprechenden Signale SIGNAL (accepted()) und SIGNAL (rejected()), also verstehe ich nicht, warum der Rückgabewert falsch ist!
Beachten Sie, dass der Dialog AlarmSetup wie erwartet funktioniert.

Jede Lösung, um den Rückgabewert zu erhalten, funktioniert?

Vielen Dank für Ihre Zeit.

hier ist der Code von 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(); 
} 
+0

Was ist Ihre Implementierung von 'slotOk'? –

+0

http://stackoverflow.com/questions/12470806/qdialog-exec-and-getting-result-value Vielleicht kann dieser Beitrag Ihnen helfen –

+0

@Dimitri - die vorgeschlagene Lösung von Jens A. Koch ist genau das, was ich getan habe! –

Antwort

0

Anruf accept(); oder reject(); statt close(). Abgelehnt ist nur der Standardwert (z. B. durch Drücken der ESC-Taste).

Ändern Sie Ihre Steckplätze, um den gewünschten Wert zurückzugeben.

Update:

Dies funktioniert für mich:

Hauptfenster (entfernt irrelevant Methoden):

void MainWindow::openDialog() 
{ 
    Dialog* dialog = new Dialog(); 
    dialog->setModal(true); 
    int result = dialog->exec(); 
    qDebug()<<"Result:"<<result; 
} 

Dialog (entfernt irrelevant Methoden):

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(); 
} 

Mit close() stattdessen von accept() Ich erhalte auch 0 für Ergebnis. Dies kann daran liegen, dass Sie in der Button-Box sind und nicht die richtige Rolle bekommen, aber nicht sicher.

Haben Sie QDialog::exec() oder QDialog::accept() außer Kraft gesetzt?

+0

Ich habe die Änderungen wie vorgeschlagen vorgenommen, der Return Code ist immer noch 0. Meiner Meinung nach sollte die Art der Aktion entsprechend dem Button-Typ und dem Signal sein, das es emitiert und nicht im Namen des Slots aufgerufen wird. –

+0

Die Dokumentation spiegelt diese Sichtweise wider, siehe enum QDialogButtonBox :: StandardButton –

+0

jetzt funktioniert es wie erwartet. Ich habe meinen Slot accept() und reject() aufgerufen, anstatt diese Funktionen meinen Slots hinzuzufügen. Mea culpa. Vielen Dank Sebastian! –

Verwandte Themen