- 将在QtCreator下写好的一个项目导入到VS,可运行。双击
Generated Files
中的ui_xxx.h
文件,提示无法打开文档。它已被重命名、删除或移动。
无法打开文档
对应的ui_xxx.h文件
新建ui文件
选择编译
编译成功
- 在项目的
GeneratedFiles
文件夹下可以发现新的ui_test.h
文件
编译生成的ui_test.h
Generated Files下无新生成的ui_test.h
- 右键
Generated Files
,添加现有项,将所有的ui_xxx.h
导入即可
手动添加
选择头文件
双击ui_dlg.h
移除无法打开的文件后
- 窗口应当通过.ui文件编辑修改,每次修改后运行,都将重新编译.ui,生成新的
ui_xxx.h
文件。因此即使在ui_xxx.h
中可以通过代码修改窗口控件,但不会修改.ui文件,而反过来,一旦修改过.ui文件,则会重新生成ui_xxx.h
,通过代码做的修改就会被覆盖
- 若要通过代码修改,应当在类的头文件和.cpp文件中修改。在头文件的private作用域中添加控件的声明
// #include <QVBoxLayout>
// #include <QMenuBar>
private:
Ui::dlg *ui;
// 以下为添加控件,记住添加对应的头文件
QVBoxLayout* layout;
QMenuBar* menuBar;
QAction* actionNew;
ui->setupUi(this);
// 以下为添加的实现
layout = new QVBoxLayout(this);
menuBar = new QMenuBar(this);
menuBar->setGeometry(QRect(0, 0, 400, 24));
QMenu* menu = menuBar->addMenu(tr("&File"));
actionNew = menu->addAction(tr("&New"));
actionNew->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_N));
layout->setMenuBar(menuBar);
setLayout(layout);
例子
- 新建一个Qt GUI项目
- 右键解决方案目录中的
Form Files
,添加新建项Qt Widget Form File
- 为了和空项目区分,添加一个PushButton作为对比
- 保存并关闭设计界面,编译.ui文件并把所有的
ui_xxx.h
文件导入到Generated Files
,可以在源码中看到,实际上生成的ui_Widget.h
里就是一个类,类名为Ui_test
,最终在namespace Ui
中有一个test
类,这些test的来源就是之前修改的objectName
- 为了使用ui文件的界面设计,添加一个头文件
test.h
// file "test.h"
#ifndef TEST_H
#define TEST_H
#include <QMainWindow>
namespace Ui {
class test;
}
class test : public QMainWindow
{
Q_OBJECT
public:
explicit test(QWidget *parent = 0);
~test();
private:
Ui::test *ui;
};
#endif // TEST_H
#include "test.h"
#include "ui_Widget.h"
test::test(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::test)
{
ui->setupUi(this);
}
test::~test()
{
delete ui;
}
- 在
main.cpp
中包含test.h
后,新建一个对象,调用show()
方法即可显示窗口
// file "main.cpp"
#include "QtGuiApplication2.h"
#include "test.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//QtGuiApplication2 w;
test w;
w.show();
return a.exec();
}
- 要通过代码修改窗口,比如添加一个菜单栏。在
test.h
的private作用域中添加控件成员,并包含对应的头文件
#ifndef TEST_H
#define TEST_H
#include <QMainWindow>
// 以下为新增的头文件
#include <QVBoxLayout>
#include <QMenuBar>
namespace Ui {
class test;
}
class test : public QMainWindow
{
Q_OBJECT
public:
explicit test(QWidget *parent = 0);
~test();
private:
Ui::test *ui;
// 以下为新增的成员
QVBoxLayout* layout;
QMenuBar* menuBar;
QAction* actionNew;
};
#endif // TEST_H
#include "test.h"
#include "ui_Widget.h"
test::test(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::test)
{
ui->setupUi(this);
// 以下为新增的实现
layout = new QVBoxLayout(this);
menuBar = new QMenuBar(this);
menuBar->setGeometry(QRect(0, 0, 400, 24));
QMenu* menu = menuBar->addMenu(tr("&File"));
actionNew = menu->addAction(tr("&New"));
actionNew->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_N));
layout->setMenuBar(menuBar);
setLayout(layout);
}
test::~test()
{
delete ui;
}
网友评论