скрыть qdialog и показать главное окно

У меня есть Qdialog, в котором я получаю некоторые входные данные для использования в моем главном окне. поэтому он должен появиться первым, чем mainwindow.

проблема в том, что мое главное окно не отображается. вот мой main.cpp

#include <QtGui/QApplication>

#include "planevolume.h"
#include "dialog.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Dialog *dialog= new Dialog;
    dialog->show();

    planevolume mainwindow;

    bool dialogcheck = dialog->isHidden();

    if (dialogcheck==1)
    {
        mainwindow.show();
    }
    else
    {
    }

    return app.exec();
}

У меня есть кнопка, которая при нажатии скрывает qdialog, и если она скрыта, должно появиться главное окно, верно?

вот слот, который я использовал:

void Dialog::startplanevolume()
{
    if (xMax==0 || yMax==0 || zMax==0 || xMMax==0 || yMMax==0 || zMMax==0)
    {
        ui->label_17->setText("Error: Can't start, invalid measures");
    }
    else
    {
        hide();
    }
}

главное окно может запускаться только после нажатия этой кнопки, так как только тогда у меня есть входы в основное окно


person SamuelNLP    schedule 29.08.2012    source источник


Ответы (3)


Итак, проблема здесь в том, что вызов dialog->show() не блокирует выполнение. В ту минуту, когда вызов сделан, он переходит к следующему методу. Вам нужно заблокировать выполнение, пока пользователь не завершит ввод данных.

Сделайте свой основной следующим образом:

QApplication app(argc, argv);

Dialog *dialog= new Dialog;
if ( dialog->exec() ) {
    planevolume mainwindow;
    mainwindow.show();
    return app.exec();
}
return 0;

И в вашем диалоговом классе сделайте так, чтобы ваш метод выглядел так:

void Dialog::startplanevolume() 
{
    if (xMax==0 || yMax==0 || zMax==0 || xMMax==0 || yMMax==0 || zMMax==0) 
    {
        ui->label_17->setText("Error: Can't start, invalid measures");
    }
    else 
    {
        this->accept();  // close the dialog with a result of 1
    }
}
person Eric Hulser    schedule 29.08.2012

Когда вы нажимаете кнопку, вы звоните своему Dialog::startplanevolume, да, но это так. Вы не возвращаетесь к основному циклу.

Если вы хотите отобразить свой mainwindow, вы можете вызвать planevolume.show() в своем Dialog::startplanevolume сразу после hide.

Однако это может быть сложно, если ваши объекты находятся в разных файлах. Так что, возможно, вы могли бы определить сигнал, подобный DialogChecked, передать этот сигнал в свой Dialog::startplanevolume (после hide, конечно...) и изменить свой main так, чтобы он вызывал mainwindow.setVisible(1) при получении DialogChecked.

person Pierre GM    schedule 29.08.2012

Действие PushButton может произойти только после вызова app.exec(). Нет смысла тестировать свойства диалога до входа в основной цикл.

Ожидаемое поведение может быть достигнуто путем настройки компонентов на последовательный асинхронный запуск. В мире Qt это означает использование сигналов и слотов.

connect(dialog, SIGNAL(accept()), &mainwindow, SLOT(show()));
person milton    schedule 29.08.2012