2012-08-29 118 views
0

我有一个Qdialog,其中我得到一些输入用于我的主窗口。所以它必须比主窗口首先出现。隐藏qdialog和显示主窗口

问题是我的主窗口不显示。这里是我的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(); 
    } 
} 

的主窗口只能启动按钮被按下,只有这样,以后我投入到主winodw

回答

1

所以这里的问题是调用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 
    } 
} 
1

当你按下按钮,你打电话你的Dialog::startplanevolume,是的,但就是这样。你不会回到主循环。

如果你想显示你的mainwindow,您可能需要调用一个planevolume.show()Dialog::startplanevolume,只是hide后。

但是,如果您的对象位于不同的文件中,可能会非常棘手。因此,也许你可以定义一个像DialogChecked这样的信号,在你的Dialog::startplanevolume(在hide之后,当然......)发出这个信号,并修改你的main,这样它会在接收到DialogChecked时调用mainwindow.setVisible(1)

0

PushButton只有在调用app.exec()之后才可能发生操作。在进入主循环之前测试对话属性没有任何意义。

通过设置组件以异步方式顺序启动,可以达到预期的行为。在Qt世界中,这意味着使用信号和插槽。

connect(dialog, SIGNAL(accept()), &mainwindow, SLOT(show()));