首页 > 编程语言 >Qt程序框架的运行机制

Qt程序框架的运行机制

时间:2023-09-20 17:23:59浏览次数:33  
标签:Widget 定时器 Qt 框架 程序 按键 运行机制 include

Qt程序框架

程序入口

当我们新建一个Qt Widget工程的时候,会自动生成四个文件:

  • main.cpp
  • widget.h
  • widget.cpp
  • widget.ui

其中main.cpp是整个程序的入口,文件中只有一个简单的main()函数。

#include "widget.h"

#include <QApplication>
#include <QLocale>
#include <QTranslator>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTranslator translator;
    const QStringList uiLanguages = QLocale::system().uiLanguages();
    for (const QString &locale : uiLanguages) {
        const QString baseName = "samp_2_2_" + QLocale(locale).name();
        if (translator.load(":/i18n/" + baseName)) {
            a.installTranslator(&translator);
            break;
        }
    }
    Widget w;
    w.show();
    return a.exec();
}

main()中定义了一个QApplication的对象a和一个Widget的对象w。其中的Widget类就是我们的Qt工程中主要需要设计的类,包含所有窗口中可视的组件,同时提供信号和槽机制,用于实现不同组件之间复杂的交互功能。QApplication类的主要作用是处理各种事件。

主程序中的代码非常简单,只有两行。

w.show();
a.exec();

exec()函数的主要功能是循环检查事件队列中是否有待处理的事件,并依次进行处理。信号与槽机制、事件处理机制,这两大机制构成了Qt编程框架的核心内容。

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;

};

Widget类中默认的内容如上所示,这是一个QWidget的派生类。并且还在Ui这个命名空间中定义了一个和Widget同名的类。Q_OBJECT是一个声明,本质上是一个定义好的宏。只有声明了Q_OBJECT的类才能使用Qt的信号与槽机制。

信号与槽机制

事件处理机制

Qt中的事件可以分为三类,分别是

  • 自生事件:由窗口系统产生的事件。
  • 发布事件:Qt或者应用程序产生的事件。
  • 发送事件:Qt或应用程序定向发送给某个对象的事件。

定时器

Qt中定义了一个QTimer类,可以方便地实现定时器。所谓的定时器,指的是每隔一定的时间间隔即产生一次触发。可以将这个触发信号作为Qt中的信号,为其设置一个槽函数,从而实现每隔一定的时间间隔调用一次槽函数,实现一些特定的功能。

#include <QTimer>
#include <QTime>
...
class MainWindow : public QWidget
{
public:
    MainWindow();
    ~MainWindows();

private:
    QTimer ftimer;
    QTime ftime_counter;
    void on_timer_timeout();  // 定时器的槽函数,可以定时器的中断服务程序
};

MainWindow类的构造函数中,需要显式地将定时器的槽函数和定时器关联。

按键事件处理

如果需要窗口程序对用户的按键输入进行响应和处理(在游戏类的应用中比较常见),可以使用Qt框架下的按键事件处理。

#include <QKeyEvent>

MainWindow类中需要对虚函数void keyPressEvent(QKeyEvent *ev)重载。在窗口程序运行的过程中,只要运行一次this->grabKeyboard()语句,所有的按键事件都会被Qt捕获,并且每按一次按键,都会调用一次我们重载过的keyPressEvent()函数。直至运行一次this->releaseKeyboard()

需要注意的是,只要窗口程序还在运行,所有的按键都会被窗口程序捕获。因此,如果用户在没有关闭窗口程序的情况下,切换到了计算机中正在运行的其他程序上,会发现键盘不能用了(因为实际的按键事件都被Qt窗口程序捕获了)。所以应当合理设置grabKeyboard()releaseKeyboard()。尽可能减少占用键盘输入的时间。

标签:Widget,定时器,Qt,框架,程序,按键,运行机制,include
From: https://www.cnblogs.com/zhixuan-chang/p/17714554.html

相关文章

  • 集合框架
    1、框架:框架就是⼈们在解决某⼀类问题时⽤的最优解决⽅案。2、集合:集合就是管理其他多个对象的对象。3、集合框架:⽤来解决如何管理多个对象的对象。4、数组的问题:①类型固定;②长度固定。5、集合的好处:①类型灵活;②长度可变。6、java集合框架是同各种接⼝和实现搭建的,位于jav......
  • pytest测试框架中数据分离以及测试用例参数化
    在进行测试自动化过程中,一个重要的最佳实践就是实现测试脚本和测试数据的分离。本文将涉及2个主题,一个是在pytest中如何实现测试用例脚本数据的分离,测试用例如何读入测试数据;二是在pytest中如何实现测试用例参数化。这两点是有区别的,如下图:flowchartLRTC[测试脚本]-->|读取外......
  • 支持JDK19虚拟线程的web框架,之五(终篇):兴风作浪的ThreadLocal
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos本篇概览本篇是《支持JDK19虚拟线程的web框架》系列的第五篇,也是全系列的终篇,之前的文章实战、写代码、读源码,想必把大家累坏了,今天咱们开启聊天模式,畅谈虚拟线程中的一......
  • 框架分析(3)-Vue.js
    (框架分析(3)-Vue.js)专栏介绍link主要对目前市面上常见的框架进行分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步。Vue.jsVue.js是一种用于构建用户界面的渐进式JavaScript框架。它是一个轻量级的框架,通过将视图层和状态层进行绑......
  • 数据分析方法论、流程和框架分别是什么?
     数据分析方法论、流程和框架是指在进行数据分析时所采用的一系列方法、步骤和结构化框架,旨在帮助数据分析人员更系统、有效地进行数据分析工作。下面将详细介绍数据分析方法论、流程和框架的概念、主要内容和实际应用。1.数据分析方法论:数据分析方法论是指在数据分析过程......
  • 全志T3(armhf) - QT5(qt5.15.10)编译与使用
    1.导入交叉编译器路径加入PATHexportPATH=$PATH:/opt/ext-toolchain/bin/我的交叉编译工具链放在/opt/ext-toolchain下ls/opt/ext-toolchainarm-linux-gnueabihfbingcc-linaro-5.3.1-2016.05-linux-manifest.txtincludeliblibexecsharels/opt/ext-toolchain......
  • qt图片处理界面
     #ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>#include<opencv2/opencv.hpp>usingnamespacecv;QT_BEGIN_NAMESPACEnamespaceUi{classMainWindow;}QT_END_NAMESPACEclassMainWindow:publicQMainWindow{Q_OBJECT......
  • Ubuntu22.04运行Splash Docker镜像报错,cloud not load the Qt platform xcb in even t
    一、问题描述Ubuntu22.04运行SplashDocker镜像报错,cloudnotloadtheQtplatformxcbineventhoughitwasfound奇怪的地方在于,停止运行,重新执行同样的语句,即恢复正常。本文只做了问题记录,没有深入研究原因。sudodockerrun-it-p8050:8050scrapinghub/splash二......
  • OpenHarmony AI框架开发指导
    OpenHarmonyAI框架开发指导一、概述1、功能简介AI业务子系统是OpenHarmony提供原生的分布式AI能力的子系统。AI业务子系统提供了统一的AI引擎框架,实现算法能力快速插件化集成。AI引擎框架主要包含插件管理、模块管理和通信管理模块,完成对AI算法能力的生命周期管理和按需......
  • 华为集成供应链流程框架
           ......