QT框架概要初识

主要文件

1个ui文件 hellowindow.ui,一个main文件main.cpp,一个窗口程序文件hellowindow.h+hellowindow.cpp。

ui文件

xml界面布局文件。qt框架根据ui文件自动生成ui代码 ui_hellowindow.h

通过工具 C:\Qt\6.5.1\mingw_64\bin\uic.exe 生成。

可手动执行这个命令自定义输出文件名来生成

 main文件

#include "qapplication.h"

int main(int argc, char *argv[]){
    QApplication a(argc, argv);
    HelloWindow w;
    w.show();
    return a.exec();//进入消息循环
}

包含了头文件 qapplication.h, 创建全局单实例 QApplication 。

QApplication父类是QGuiApplication,QGuiApplication父类是QCoreApplication。

QApplication包含的功能最多,也就最笨重,QGuiApplication到QCoreApplication越来越轻。

开发的应用无图像界面,就使用QCoreApplication;有图形界面,只使用QML实现(如果需要使用系统托盘还是得用QApplication),使用QGuiApplication,使用QWidget,或者QML与QWidget使用,则用QApplication。

QApplication类管理GUI程序的控制流和主要设置,基于QWidget,处理QWidget特有的初始化和结束收尾工作。如果不是基于QWidget的程序,则使用QGuiApplication,QGuiApplication不依赖于Widget特有的库。有些程序是不使用GUI的,这时使用QCoreApplication即可,避免初始化不必要的GUI资源。

QApplication类管理GUI程序的控制流和主要设置,是基于QWidget的,为此特化了QGuiApplication的一些功能,处理QWidget特有的初始化和结束收尾工作。
对于使用了Qt的任何GUI程序来说,不管何时何地有多少个Window,但只有一个QApplication对象,如果不是基于QWidget的程序,相应的则使用QGuiApplication,后者不依赖于Widget特有的库。
有些程序是不使用GUI的,通过命令行参数执行不同的任务而不用手动设置,这时使用QCoreApplication就够了,避免初始化不必要的GUI资源。

QApplication的主要功能:
1、使用用户的桌面设置进行初始化,这些设置如palette()font()doubleClickInterval(),然后跟踪这些属性的变化,如用户通过某种配置面板修改了全局桌面设置;
2、处理事件,从窗口系统接收事件并派发到相应的Widget,使用sendEvent()postEvent()函数可以派发事件;
3、处理命令行参数,设置内部状态;
4、定义GUI外观,外观由QStyle对象包装,运行时通过setStyle()函数进行设置;
5、设置颜色分配规则,对应的函数为setColorSpec();
6、本地化字符串,函数为translate();
7、提供了一些有用的对象,如desktop()clipboard()函数;
8、知道Widget及Window,相应的函数为widgetAt()topLevelWidgets()closeAllWindows();
9、管理鼠标光标,函数为setOverrideCursor()

hellowindow.hpp 文件

class HelloWindow : public QMainWindow
{
    Q_OBJECT

public:
    HelloWindow(QWidget *parent = nullptr);
    ~HelloWindow();

private slots:
    void OnBtnClick();

private:
    Ui::HelloWindow *ui;
};

QT在C++基础上增加了一些自己特有的语法特性,因为这些特性所以QT需要引入不一样的编译器解释这些特性之后才能编译。元对象编译器 moc(Meta-Object compiler),Qt 程序在交由标准编译器编译之前,会使用 moc 分析 C++ 源文件,分析出来的结果是自动生成一些额外的cpp文件来参与编译,即QT在进行标准C++编译之前先通过 moc解释自己的特性生成标准编译器能编译的C++文件之后才进行编译。

Q_OBJECT 定义

#define Q_OBJECT \
public: \
    QT_WARNING_PUSH \
    Q_OBJECT_NO_OVERRIDE_WARNING \
    static const QMetaObject staticMetaObject; \
    virtual const QMetaObject *metaObject() const; \
    virtual void *qt_metacast(const char *); \
    virtual int qt_metacall(QMetaObject::Call, int, void **); \
    QT_TR_FUNCTIONS \
private: \
    Q_OBJECT_NO_ATTRIBUTES_WARNING \
    Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); \
    QT_WARNING_POP \
    struct QPrivateSignal { explicit QPrivateSignal() = default; }; \
    QT_ANNOTATE_CLASS(qt_qobject, "")

在Qt中,QObject是所有Qt类的基类,是Qt对象模型的核心,只有继承了QObject类的类,才具有信号槽的能力。所以,为了使用信号槽,必须继承QObject。凡是QObject类(不管是直接子类还是间接子类),都应该在第一行代码写上Q_OBJECT。不管是不是使用信号槽,都应该添加这个宏。这个宏的展开将为我们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。

Q_SIGNALS 和 Q_SLOTS 的定义

#ifdef Q_SIGNALS
#  define Q_SIGNALS public __attribute__((annotate("qt_signal")))
#endif

#ifdef Q_SLOTS
#  define Q_SLOTS __attribute__((annotate("qt_slot")))
#endif

__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。告诉编译器在编译的时候需要怎么做。

QMainWindow

class Q_WIDGETS_EXPORT QMainWindow : public QWidget,

class Q_WIDGETS_EXPORT QDialog : public QWidget,

QMainWindow 和 QDialog 都继承自QWidget。

 

QMainWindow中在setUi时自动为用户创建了一个菜单栏、工具栏、中心窗口和状态栏。而QWidget是没有这几点的。

QWidget运行后就只有一个“页面”,而QMainWindow运行后生成了一个“窗口”。setMenuBar、addToolBar、setCentralWidget、setStatusBar几种行为只有QMainWindow类具有。 因此,在继承自QWidget类的用户类中无法创建菜单栏等几种行为。

QMainWindow窗口包含菜单栏、工具栏、状态栏、标题栏等,是最常见的窗口形式,也可以说是GUI程序的主窗口。

QDialog是对话框窗口的基类。对话框主要用来执行短期任务,或者与用户进行互动,它可以是模态的,也可以是非模态的。他没有菜单栏、工具栏、状态栏等。

如果是主窗口,就使用QMainWindow类。

如果是对话框,就使用QDialog类。

如果不确定,有可能作为顶层窗口,也有可能嵌入到其他窗口,就使用QWidget类。

总结

QMainWindow 是窗口实例,QApplication 是窗口运行的环境,是QMainWindow的控制面板。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tangcpp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值