Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt在菜单项上显示模式对话框(.ui)单击_C++_Qt_Modal Dialog - Fatal编程技术网

C++ Qt在菜单项上显示模式对话框(.ui)单击

C++ Qt在菜单项上显示模式对话框(.ui)单击,c++,qt,modal-dialog,C++,Qt,Modal Dialog,我想创建一个简单的“关于”模式对话框,从帮助->关于应用程序菜单调用。我已经用QT创建者(.ui文件)创建了一个模式对话框窗口 菜单“关于”插槽中应该有什么代码 现在我有了这段代码,但它显示了一个新的模式对话框(不是基于我的about.ui): 谢谢 您需要使用.UI文件中的UI设置对话框。Qtuic编译器从.ui文件生成一个头文件,您需要将其包含在代码中。假设您的.ui文件名为about.ui,对话框名为about,然后uic创建包含类ui\u about的文件ui\u about.h。有不同

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

菜单“关于”插槽中应该有什么代码

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


谢谢

您需要使用
.UI
文件中的UI设置对话框。Qt
uic
编译器从
.ui
文件生成一个头文件,您需要将其包含在代码中。假设您的
.ui
文件名为
about.ui
,对话框名为
about
,然后
uic
创建包含类
ui\u about
的文件
ui\u about.h
。有不同的方法来设置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);
};
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();
}
用法:

#include <QDialog>
#include "ui_about.h"

class AboutDialog : public QDialog, public Ui::About {
    Q_OBJECT

public:
    AboutDialog( QWidget * parent = 0);
};
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()
对于模式对话框,应使用QDialogs方法

about = new QDialog(0, 0);

// The method does not return until user closes it.
about->exec();

// In this point, the dialog is closed.
说:

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



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

谢谢你,安德烈亚斯!以目前最简单的方式。。。事实上,关于.h的ui_没有创建,现在也没有预设。因此,具有您首先指定的代码的项目不会编译。有没有办法手动创建ui_about.h?。您可以使用
uic about.ui-o ui_about.h
手动创建它。但是您的构建系统应该处理它-确保
FORMS=about.ui
包含在
.pro
文件中。在.pro文件中是否有任何奇怪的条目?不久前,由于没有创建资源文件,出现了一个类似的问题:没有,my.pro:FORMS+=mainwindow.ui\about.uiI中的一切都很好。我从命令shell创建了ui_about.h,但在编译时仍然会出现错误:“about”未在此范围内声明