学Qt,此问题必解!

描述

最近有小伙伴问到:在Qt开发中,当使用QtCreator自带的工程向导创建了一个类后,如下代码所示:

Qt

问题来了:上图红色矩形框圈出的两个地方描述的是同一个类吗

首先这个问题刚接触Qt的时候可能会有此一问,在此处记录一下。这里需要知道上述代码是QtCreator自动生成的(如果使用向导创建一个类)。

用同样的方法新创建一个类,(用鼠标点击工程项目后,右键单击,选择“添加新文件”,在弹出的对话框中,选择Qt->Qt设计师界面类->Widget)将会弹出“选择类名”对话框:

Qt

在上图中,默认情况下其头文件、源文件和Form文件都是同一个命名,点击下一步后则创建一个名为Form的类,该类位于form.h/.cpp中。在from.h头文件中,该类定义如下:

Qt

可以看到,Form类和MainWindow类在生成方式上是一样的。

好啦,如果我们在新创建类的时候为其重新命名:Qt其自动生成的代码还是那种方式的写法:Qt

至此,得出一个结论:

这是QtCreator的固定写法,当我们新创建类的时候,QtCreator这个IDE会自动生成。

言归正传,回到本文的问题,下图中红色圈出的地方,虽然在名称上是一样的,但是他俩不是同一个东西。由于使用了QtCreator的类创建向导创建类,所以他们在名称上是一样的Qt

上述问题还引出了另一个问题:Qt中界面与逻辑的分离,在这一点上应该很好的体现这一思想。接着往下看:

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

本质上,上述代码是UI界面类的声明:QT_BEGIN_NAMESPACEQT_END_NAMESPACE两个宏定义是Qt对命名空间的一个包装,上述语句中,class MainWindow;则是指界面类。当我们的工程在编译构建后,会生成一个类似于ui_xxx.h的文件,界面类则放置在这个文件中,本文则是ui_mainwindow.h,该文件会在对应的源文件中包含:Qt

注:ui_xxx.h是由QtCreator根据界面中的组成元素自动生成的,可在对应的xxx.ui文件中查看该类中包含了哪些界面组成元素。

由于此处mainwindow.ui文件中没有放置多余的界面元素,故生成的文件比较简单,这里是ui_mainwindow.h文件,自动生成代码如下:

#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include 
#include 
#include 
#include 
#include 
#include 

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralwidget;
    QMenuBar *menubar;
    QStatusBar *statusbar;

    void setupUi(QMainWindow *MainWindow)
    {
        if (MainWindow->objectName().isEmpty())
            MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
        MainWindow->resize(800600);
        centralwidget = new QWidget(MainWindow);
        centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
        MainWindow->setCentralWidget(centralwidget);
        menubar = new QMenuBar(MainWindow);
        menubar->setObjectName(QString::fromUtf8("menubar"));
        MainWindow->setMenuBar(menubar);
        statusbar = new QStatusBar(MainWindow);
        statusbar->setObjectName(QString::fromUtf8("statusbar"));
        MainWindow->setStatusBar(statusbar);

        retranslateUi(MainWindow);

        QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QCoreApplication::translate("MainWindow""MainWindow"nullptr));
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H

从上述代码可见,在mainwindow.h文件中的:

namespace Ui { class MainWindow; }

则是对ui_mainwindow.h文件中定义的MainWindow的声明。回到mainwindow.h文件中,在MainWindow类中有一个私有数据成员:ui指针,该指针指向了Ui::MainWindow,且在mainwindow.cpp文件中实例了Ui::MainWindow类,而且还通过ui指针调用了setupUi()函数初始化了界面。在Qt中,正是通过这种方式将界面与逻辑进行了关联。

一个软件界面由很多界面元素组成,在实际工程开发中,通过QtCreator可以在xxx.ui文件中使用鼠标快速进行布局和创建界面组成元素。在对应的xxx.h/.cpp文件中使用ui指针则可以引用xxx.ui文件中生成的界面元素。

『这正是Qt框架的特性!』

 


 


审核编辑 :李倩

 


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分