.ui文件

作者: downdemo | 来源:发表于2018-08-06 10:28 被阅读17次
    • 将在QtCreator下写好的一个项目导入到VS,可运行。双击Generated Files中的ui_xxx.h文件,提示无法打开文档。它已被重命名、删除或移动。
    无法打开文档
    • 但在文件夹中是可以找到此文件的
    对应的ui_xxx.h文件
    • 新建一个ui文件
    新建ui文件
    • 右键并编译
    选择编译
    • 编译成功
    编译成功
    • 在项目的GeneratedFiles文件夹下可以发现新的ui_test.h文件
    编译生成的ui_test.h
    • 但在VS的工程目录中仍看不到
    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;
    
    • 在.cpp文件中的构造函数添加实现(添加菜单栏)
    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作为对比
    • 修改objectNametest
    • 保存并关闭设计界面,编译.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
    
    • 再添加源文件test.cpp
    #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
    
    • test.cpp的构造函数中添加实现
    #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;
    }
    
    • 运行,多出了File菜单栏

    相关文章

      网友评论

          本文标题:.ui文件

          本文链接:https://www.haomeiwen.com/subject/ocjwvftx.html