Skip to content

GUI与库

在Qt应用程序开发中,QCoreApplicationQApplication是两个至关重要的类。它们分别用于创建和管理控制台应用程序和GUI应用程序的事件循环。QCoreApplication提供了所有应用程序都需要的核心功能,而QApplication则继承自QCoreApplication,并扩展了与GUI相关的功能。

QCoreApplication

QCoreApplication是一个基础类,用于管理非GUI应用程序的控制流和主要设置。它处理应用程序的初始化和清理工作,提供了事件循环的运行机制,并提供了访问应用程序级别的功能和设置的接口。
事件循环是QCoreApplication的关键机制。是一个永不停歇的循环(通过exec()函数启动),不断地从操作系统获取事件消息。这些事件可以来自多种渠道,如网络模块(当有新的网络连接请求或者数据到达时)、定时器模块(定时器到期)等。
事件循环会维护一个事件队列,新产生的事件会被放入这个队列中,然后按照顺序逐个取出事件并分发给对应的对象进行处理。例如,当一个定时器到期产生QTimerEvent时,事件循环会将这个事件发送给之前关联了该定时器的对象的timerEvent函数进行处理。

cpp
int main(int argc, char* argv[]) {  
    QCoreApplication app(argc, argv);  
    //...  
    return app.exec();  
}

事件分发流程:QCoreApplication::eventFilter -> 接受者eventFilter -> 接受者event -> 接受者细分event -> 接受者父对象。

QGuiApplication

QGuiApplicationQApplication的基础,提供了一些与图形用户界面相关的基本功能,如处理屏幕信息、字体和输入法等。它适用于那些只需要基本图形界面支持而不需要完整窗口系统功能的应用程序。

QApplication

QApplication继承自QGuiApplication,这意味着它继承了QGuiApplication的所有核心功能,如事件循环机制、应用程序初始化和清理逻辑以及部分应用程序级别的功能接口。在构建GUI应用程序时,QApplication首先会调用QGuiApplication的构造函数完成底层的基础设置,为后续的GUI相关操作提供稳固的基础。
QApplication还处理了与窗口系统相关的一些特定功能,如处理应用程序的命令行参数、设置应用程序的图标和风格、管理应用程序的主窗口等。

应用场景:

  • 如果应用程序是无界面的,直接使用QCoreApplication即可。
  • 如果是GUI相关,但没有使用widgets模块,就使用QGuiApplication
  • 否则使用QApplication

GUI-QWidget

在Qt中,widget(小部件或控件)是构建图形化界面的核心元素。QWidget作为所有用户界面对象的基类,发挥着至关重要的作用。
QWidget继承自QObjectQPaintDeviceQObject为其赋予了强大的对象模型特性,包括信号与槽机制。这使得不同的QWidget对象之间能够进行高效且灵活的通信,极大地便利了复杂用户界面和逻辑交互的构建。同时,QObject还负责对对象的内存管理和元对象系统的相关功能。
而继承自QPaintDevice则让QWidget具备了绘图的能力,能够在其界面上进行各种图形和图像的绘制操作。

cpp
class Q_WIDGETS_EXPORT QWidget : public QObject, public QPaintDevice {  
    Q_OBJECT  
    ...  
public:  
    enum RenderFlag {  
        DrawWindowBackground = 0x1,  
        DrawChildren = 0x2,  
        IgnoreMask = 0x4  
    };  
    Q_DECLARE_FLAGS(RenderFlags, RenderFlag)  

public Q_SLOTS:  
    void setEnabled(bool);  
    ...  
public Q_SLOTS:  
    void setWindowTitle(const QString &);  
    ...  
public:  
    bool isActiveWindow() const;  
    ...  
public Q_SLOTS:  
    virtual void setVisible(bool visible);  
    void setHidden(bool hidden);  
    void show();  
    void hide();  
    void showMinimized();  
    void showMaximized();  
    void showFullScreen();  
    void showNormal();  
    bool close();  
    void raise();  
    void lower();  

public:  
    void stackUnder(QWidget*);  
    void move(int x, int y);  
    void move(const QPoint &);  
    void resize(int w, int h);  
    void resize(const QSize &);  
    ...  
public:  
    QLayout *layout() const;  
    ...  
public:  
    virtual QVariant inputMethodQuery(Qt::InputMethodQuery) const;  
    Qt::InputMethodHints inputMethodHints() const;  
    void setInputMethodHints(Qt::InputMethodHints hints);  

protected Q_SLOTS:  
    void updateMicroFocus();  

protected:  
    void create(WId = 0, bool initializeWindow = true, bool destroyOldWindow = true);  
    void destroy(bool destroyWindow = true, bool destroySubWindows = true);  
    friend class QDataWidgetMapperPrivate;  
    virtual bool focusNextPrevChild(bool next);  
    inline bool focusNextChild() { return focusNextPrevChild(true); }  
    inline bool focusPreviousChild() { return focusNextPrevChild(false); }  

protected:  
    QWidget(QWidgetPrivate &d, QWidget* parent, Qt::WindowFlags f);  
private:  
    void setBackingStore(QBackingStore *store);  
    bool testAttribute_helper(Qt::WidgetAttribute) const;  
    QLayout *takeLayout();  
    friend class QBackingStoreDevice;  
    ...  
private:  
    ...  
    QWidgetData *data;  
};

这是一个标准的C++语言规范定义下的类,继承于QObject(用于实现底层的信号与槽)和QPaintDevice(用于绘图)。

QWidget常用函数

  • 设置窗口标题void setWindowTitle(const QString &);
  • 获取窗口标题QString windowTitle() const;
  • 设置窗口图标void setWindowIcon(const QIcon &);
    • 说明:QIcon是一个Qt中用于表示图标的类,它可以用于在用户界面中显示图标,例如在按钮、菜单项、工具栏等控件上。QIcon可以加载多种格式的图标文件,如PNG、SVG、XPM等,并提供了丰富的接口用于管理和操作图标。
  • 获取窗口图标QIcon windowIcon() const;
  • 返回设备类型int devType() const override;
    • 说明:这里的override关键字作用是限制引用其的.cpp文件必须给出其相应的函数体。
  • 判断是否为顶层窗口bool isTopLevel() const;
  • 获取x坐标int x() const;
  • 获取y坐标int y() const;
  • 获取位置QPoint pos() const;
    • 说明:QPoint是Qt中表示二维平面上点的类。它包含了两个整数类型的成员变量,分别表示点的横坐标和纵坐标。
  • 获取大小QSize size() const;
  • 获取宽度inline int width() const;
  • 获取高度inline int height() const;
  • 获取最小大小QSize minimumSize() const;
  • 获取最大大小QSize maximumSize() const;
  • 设置固定大小void setFixedSize(const QSize &);

QWidget的子类

  • QDialog:用于实现对话框的类。对话框通常用于与用户进行短期交互,例如获取用户输入、显示消息等。它具有一些默认的行为,比如通常会阻塞父窗口的操作,直到对话框关闭。对话框一般会有默认的按钮(如“确定”、“取消”等),并且其大小通常是固定的或者根据内容自适应。
  • QMainWindow:是一个主窗口类,通常用于构建具有菜单栏、工具栏、状态栏和中心工作区的应用程序主窗口。它提供了一些预设的布局和功能,方便开发者组织和管理界面元素。

除了直接使用QWidgetQDialogQMainWindow之外,Qt还提供了许多QWidget的子类,常用的子类包括:

  • QPushButton:按钮控件,用于触发操作或事件。
  • QLabel:标签控件,用于显示文本或图像。
  • QLineEdit:单行文本输入框控件,用于接收用户输入。
  • QTextEdit:多行文本输入框控件,用于接收用户多行输入。
  • QSpinBox:整数微调框控件,用于选择整数值。
  • QComboBox:下拉列表框控件,用于从预定义的选项中选择一个。
  • QCheckBox:复选框控件,用于表示两种状态的选项。

作业:

  • 设计后期阶段性项目“聊天软件”的UI。
  • 把UI设计的好看一些。
  • 去学习一下CSS样式表。

知识如风,常伴吾身