【问题标题】:hide qdialog and show mainwindow隐藏 qdialog 并显示主窗口
【发布时间】:2012-08-29 14:45:11
【问题描述】:

我有一个 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

【问题讨论】:

    标签: qt dialog qmainwindow


    【解决方案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
        }
    }
    

    【讨论】:

      【解决方案2】:

      当您按下按钮时,您会拨打您的Dialog::startplanevolume,是的,仅此而已。你不会回到主循环。

      如果您想显示您的mainwindow,您可能需要在Dialog::startplanevolume 中调用planevolume.show(),紧跟在hide 之后。

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多