【问题标题】:Qt show modal dialog (.ui) on menu item clickQt在菜单项单击时显示模式对话框(.ui)
【发布时间】:2012-10-29 06:30:12
【问题描述】:

我想制作一个简单的“关于”模式对话框,从帮助->关于应用程序菜单中调用。我用 QT Creator(.ui 文件)创建了一个模态对话框窗口。

菜单“关于”插槽中应包含什么代码?

现在我有了这段代码,但它显示了一个新的模式对话框(不是基于我的 about.ui):

void MainWindow::on_actionAbout_triggered()
{
    about = new QDialog(0,0);
    about->show();
}

谢谢!

【问题讨论】:

    标签: c++ qt modal-dialog


    【解决方案1】:

    您需要使用 .ui 文件中的 UI 设置对话框。 Qt uic 编译器从您的 .ui 文件生成一个头文件,您需要将其包含在代码中。假设你的.ui文件叫about.ui,Dialog叫About,那么uic创建文件ui_about.h,包含一个类Ui_About。有不同的方法来设置你的 UI,最简单的你可以这样做

    #include "ui_about.h"
    
    ...
    
    void MainWindow::on_actionAbout_triggered()
    {
        about = new QDialog(0,0);
    
        Ui_About aboutUi;
        aboutUi.setupUi(about);
    
        about->show();
    }
    

    更好的方法是使用继承,因为它可以更好地封装您的对话框,以便您可以在子类中实现特定于特定对话框的任何功能:

    AboutDialog.h:

    #include <QDialog>
    #include "ui_about.h"
    
    class AboutDialog : public QDialog, public Ui::About {
        Q_OBJECT
    
    public:
        AboutDialog( QWidget * parent = 0);
    };
    

    关于Dialog.cpp:

    AboutDialog::AboutDialog( QWidget * parent) : QDialog(parent) {
    
        setupUi(this);
    
        // perform additional setup here ...
    }
    

    用法:

    #include "AboutDialog.h"
    
    ...
    
    void MainWindow::on_actionAbout_triggered() {
        about = new AboutDialog(this);
        about->show();
    }
    

    无论如何,重要的代码是调用setupUi()方法。

    顺便说一句:上面代码中的对话框是非模态的。要显示模式对话框,请将对话框的 windowModality 标志设置为 Qt::ApplicationModal 或使用 exec() 而不是 show()

    【讨论】:

    • 谢谢你,安德烈亚斯!暂时采用最简单的方法...事实是 ui_about.h 没有创建,现在也没有预设。因此,具有您首先指定的代码的项目无法编译。有没有办法手动创建 ui_about.h?..
    • 您可以使用uic about.ui -o ui_about.h 手动创建它。但是您的构建系统应该处理它 - 确保 FORMS=about.ui 包含在您的 .pro 文件中。
    • .pro 文件中是否有任何奇怪的条目?前段时间有一个类似的问题,资源文件没有被创建:stackoverflow.com/questions/12380171/…
    • 不,我的 .pro 中一切正常:FORMS += mainwindow.ui \ about.ui
    • 我从命令行创建了 ui_about.h,但是编译时仍然报错:'about' 没有在这个范围内声明
    【解决方案2】:

    对于模态对话框,你应该使用QDialogs的exec()方法。

    about = new QDialog(0, 0);
    
    // The method does not return until user closes it.
    about->exec();
    
    // In this point, the dialog is closed.
    

    Docs说:

    显示模式对话框的最常用方法是调用其exec() 函数。当用户关闭对话框时,exec() 将提供一个有用的返回值。


    替代方式:您不需要需要模式对话框。让对话框显示无模式并将其accepted()rejected() 信号连接到适当的插槽。然后你可以把你所有的代码放在 accept 槽中,而不是把它们放在show() 之后。因此,使用这种方式,您实际上不需要模态对话框。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多