我有一个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,如果它隐藏的比主窗口应该显示的那样,对吧?
这是我使用的SLOT:
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的输入
答案 0 :(得分:1)
当你按下按钮时,你打电话给Dialog::startplanevolume
,是的,但就是这样。你不回到主循环。
如果您想显示mainwindow
,可能需要在planevolume.show()
之后的Dialog::startplanevolume
中呼叫hide
。
但是,如果您的对象位于不同的文件中,则可能会非常棘手。所以也许您可以定义DialogChecked
之类的信号,在Dialog::startplanevolume
(hide
之后,当然......)中发出此信号,并修改您的main
以便它会在收到mainwindow.setVisible(1)
时致电DialogChecked
。
答案 1 :(得分:1)
所以这里的问题是调用dialog-&gt; 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
}
}
答案 2 :(得分:0)
PushButton
操作可能仅在调用app.exec()
后发生。在输入主循环之前测试对话框属性是没有意义的。
可以通过将组件设置为以异步方式顺序启动来达到预期的行为。在 Qt 世界中,这意味着使用信号和插槽。
connect(dialog, SIGNAL(accept()), &mainwindow, SLOT(show()));