Qt绘图与信号事件

QT——事件 mousePressEvent(鼠标按下事件)、mouseReleaseEvent(鼠标释放事件)、mouseMoveEvent(鼠标移动事件)、mouseDoubleClickEvent(鼠标双击事件)等。所有事件,只能在主窗口中被捕获,子窗口无法自动捕获事件(排除焦点在子窗口身上的时候,之后再说这个问题) 这个时候,就要将事件从主窗口派发给子窗口 但是事件派发这个事情,要么一个不派发,要派发就所有事件一起派发,所以子窗口就需要写一个事件过滤器,将自己不需要的事件过滤掉,只留下自己需要的事件。 阅读详情

Qt应用开发的基本模式(面向对象)

  1. 继承QDailog
  • gkdialog.h
#ifndef GK_DIALOG_H
#define GK_DIALOG_H
#include <QtWidgets/QDialog>

class GKDialog: public QDialog{
public:
    GKDialog(QWidget *parent=0);
    ~GKDialog();
};
#endif
  • gkdialog.cpp
#include "gkdialog.h"
#include <iostream>

GKDialog::GKDialog(QWidget *parent):
    QDialog(parent){
    std::cout << "对话框初始化" << std::endl;
}

GKDialog::~GKDialog(){
    std::cout << "释放" << std::endl;
}
  1. QApplication
  • gkapp.h
#ifndef GK_APP_H
#define GK_APP_H
#include <QtWidgets/QApplication>
#include "gkdialog.h"
class GKApp : public QApplication{
public:
    GKApp(int argc, char **argv);
    ~GKApp();
private:
    GKDialog *dlg;
};
#endif
  • gkapp.cpp
#include "gkapp.h"
#include <iostream>
GKApp::GKApp(int argc, char **argv):
    QApplication(argc, argv),
    dlg(new GKDialog()){  // 构造初始化列表
    dlg = new GKDialog();
    dlg->resize(600, 400);
    dlg->move(200, 200);
    dlg->show();
    std::cout << "应用初始化" << std::endl;
}

GKApp::~GKApp(){
    std::cout << "应用释放" << std::endl;
    delete dlg;
}
  1. main.cpp
#include "gkapp.h"
// #include "gkdialog.h"

int  main(int argc, char **argv){
    // 创建Qt应用
    GKApp app(argc, argv);
    // 创建对话框
    // 消息循环
    // 返回状态码
    return app.exec();
}
  1. Makefile
INCLUDES = /I "C:/Qt/Qt5.13.0/5.13.0/msvc2017_64/include"

LIBS     = /LIBPATH:"C:/Qt/Qt5.13.0/5.13.0/msvc2017_64/lib" \
           /DYNAMICBASE  \
	         "Qt5Widgets.lib"  \
		     "Qt5Gui.lib" \
		     "Qt5Core.lib"
CL_ARGS  = /EHsc \
           /MD \
		   /source-charset:utf-8 \
		   /execution-charset:utf-8 \
		   /nologo
LINK_ARGS = /MACHINE:X64  /NOLOGO 

main:main.cpp gkapp.cpp gkdialog.cpp
	@cl /c $(CL_ARGS) /Fo:main.obj  $(INCLUDES) main.cpp
	@cl /c $(CL_ARGS) /Fo:app.obj  $(INCLUDES) gkapp.cpp
	@cl /c $(CL_ARGS) /Fo:dialog.obj  $(INCLUDES) gkdialog.cpp
	@link $(LINK_ARGS) $(LIBS) /OUT:main.exe  main.obj app.obj dialog.obj 

clean:
	@del *.exe *.obj *.exp 2>/Nul
  • 说明:
    • 三种使用模式的体会:
      • 第一种对话框与应用程序并列呈现,我们通常不采用这种并列的方式
      • 第二种(即为上面的代码形式),对话框与应用程序为包含关系,这种方式可控性强、风险低。

设计UI(Qt Designer)

代码实现

  1. 定义成员

  2. 创建对象

  3. 设置属性

工具实现

  • Qt Designer(Qt设计大师)
  1. 步骤1:创建模板,保存为ui文件

  2. 拖组件满足功能

  3. 外观的设计

  4. 命名规范

  5. 交互设计

    1. 设计槽(slot)函数
    2. 组件的信号与槽函数关联

使用UI

  • 条件是*.ui文件
  1. 编译ui文件为.h文件

    • uic [options] [uifile]
      1. -o 输出的文件 : 建议文件输出为.h文件
  2. 创建ui对象

  3. 使用ui对象的setupUi绑定我们的对话框
    ui->setupUi(this);

  4. 实现ui设计中的槽函数

  5. 所有定义了槽函数的头文件需要编译成moc的cpp文件。

    • cpp需要编译与链接

    • 注意事项;定义槽函数或者是信号的类,需要添加一个宏,Q_OBJECT

    • moc [options] [header-file]

      • 选项: -o 输出的文件moc_***.cpp

Qt画图

  1. Qt应用
    QApplication

    • QDialog
  2. 绘制事件

    • 完成绘图编程模式

    • QPainter

  3. 键盘事件

    • 通过键盘控制=图形的活动
  4. 代码

  • hwdialog.h
#ifndef HW_DIALOG_H
#define HW_DIALOG_H
#include <QtWidgets/QDialog>
#include <QtGui/QkeyEvent>

class HWDialog: public QDialog{
public:
    HWDialog(QWidget *parent=0);
    ~HWDialog();
public:
    virtual void paintEvent(QPaintEvent *e);
    virtual void keyPressEvevt(QKeyEvent *e);
private:
    int x, y;
};
#endif
  • hwdialog.cpp
#include "hwdialog.h"
#include <iostream>
#include <QtGui/QPainter>

HWDialog::HWDialog(QWidget *parent):
    QDialog(parent),
    x(100), y(100){
    
}

HWDialog::~HWDialog(){
   
}

void HWDialog::paintEvent(QPaintEvent *e){
    QPainter painter(this);
    QColor color(255, 0, 0, 255);
    QPen pen(color);
    painter.setPen(pen);
    painter.drawRoundedRect(x, y, 100,200,20, 15); 
}

void HWDialog::keyPressEvevt(QKeyEvent *e){
    if(e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_Up){
        y -= 2;
    }
    if(e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_Down){
        y += 2;
    }
    if(e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_Left){
        x -= 2;
    }
    if(e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_Right){
        x += 2;
    }
    this->repaint();
}
  • QApplication、main.cpp、Makefile三部分代码与Qt开发的基本模式相同,在此不再进行展示。

  • 运行展示

Qt多线程

  1. 使用线程完成数据同步处理
  • 代码

thdialog.h

#ifndef TH_DIALOG_H
#define TH_DIALOG_H
#include <QtWidgets/QDialog>
#include <QtGui/QKeyEvent>
#include "thfish.h"

class THDialog: public QDialog{
public:
    THDialog(QWidget *parent=0);
    ~THDialog();
public:
    virtual void  paintEvent(QPaintEvent *e);
    virtual void  keyPressEvent(QKeyEvent *e);

private:
    THFish *fish;

    THFish *fish2;
};

#endif

thdialog.cpp

#include "thdialog.h"
#include <iostream>
#include <QtGui/QPainter>
THDialog::THDialog(QWidget *parent):
    QDialog(parent),
    fish(new THFish(100, 100)),
    fish2(new THFish(200, 100)){
    fish->start(); // 线程启动
    fish2->start();
}

THDialog::~THDialog(){

}

// override绘制函数
void THDialog::paintEvent(QPaintEvent *e){
    // 在这里完成绘制工作
    QPainter painter(this);
    fish->showFish(&painter);
    fish2->showFish(&painter);
}
void  THDialog::keyPressEvent(QKeyEvent *e){
    if(e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_Up){
        // std::cout << "up" << std::endl;
        fish->changeDir(90);
        fish->swim();
    }
    if(e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_Down){
        // std::cout << "down" << std::endl;
        fish->changeDir(270);
        fish->swim();
    }
    if(e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_Left){
        // std::cout << "left" << std::endl;
        fish->changeDir(180);
        fish->swim();
    }
    if(e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_Right){
        // std::cout << "right" << std::endl;
        fish->changeDir(0);
        fish->swim();
    }
    this->repaint();
}

thfish.h

#ifndef TH_FISH_H
#define TH_FISH_H
#include <QtCore/QThread>
#include <QtGui/QPainter>

class THFish : public QThread{
    Q_OBJECT
public:
    THFish(int x=0, int y=0, int m=45, int d=0);
    void openMouth();
    void changeDir(int dir);
    void swim();
    void showFish(QPainter *painter);
protected:
    virtual void run();
private:
    int mouth;
    int pos_x, pos_y;
    int dir;
    bool isopen;
};
#endif

thfish.cpp

#include "thfish.h"

THFish::THFish(int x, int y, int m, int d):
    mouth(m), isopen(false), 
    pos_x(x), pos_y(y), 
    dir(d){
    
}
void THFish::run(){
    while(true){
        openMouth();
        QThread::usleep(100000);
    }
}
void THFish::openMouth(){
    if(isopen){
        mouth += 5;
        if(mouth >= 45){
            isopen=!isopen;
            mouth = 45;
        }
    }else{
        mouth -= 5;
        if(mouth <= 0){
            isopen=!isopen;
            mouth = 0;
        }
    }
}
void THFish::changeDir(int dir){
    this->dir = dir;
}
void THFish::swim(){
    if(this->dir == 0){
        pos_x += 2;
    }
    if(this->dir == 90){
        pos_y -= 2;
    }
    if(this->dir == 180){
        pos_x -= 2;
    }
    if(this->dir == 270){
        pos_y += 2;
    }
}
void THFish::showFish(QPainter *painter){
    QColor color(255, 0, 0, 255);
    QPen pen(color);
    painter->setPen(pen);
    painter->drawPie(pos_x, pos_y, 50, 50, mouth * 16 + dir * 16, (360 - 2 * mouth) *16);
}
  1. 通信机制:信号与槽

    1. 定义信号
      在fish.h文件的类中定义:
      •    signals:
           void sign_open();
        
    2. 发送信号
      在fish.cpp文件的run()函数中发送:
      •    emit sign_open();
        
    3. 绑定信号到目标
    4. 目标需要有一个slot函数处理信息
      在dialog.cpp文件中,线程启动前绑定:
      •   QObject::connect(fish, SIGNAL(sign_open()), this, SLOT(repaint()));
          QObject::connect(fish2, SIGNAL(sign_open()), this, SLOT(repaint()));
        
  2. 绘制刷新实现动画

  3. 运行展示
    在这里插入图片描述

qtEvent, 事件传递、事件过滤器、update()、绘图事件、鼠标事件、鼠标穿透 catalog杂谈构造函数内的connectevent与MousePressEvent内存的父类、对象树的父类event介绍事件event与Mouse 杂谈 构造函数内的connect MyBtn::MyBtn(){ connect( this, &QPushButton::clicked, this, [&](){ 111 } ); } MyBtn* obj; connect( obj, &QPushButton::clicked, this, [&](){ 222 阅读详情

相关推荐

Qt开发入门:实用技巧与实例

QT是一个跨平台图形界面引擎。历史:1991奇趣科技写到signals下返回void需要声明,不需要实现可以有参数写到public slot下或者public或者全局函数返回void需要声明,也需要实现可以有参数,可以重载触发自定义信号关键字 emit案例下课后,老师触发饿了信号,学生相应信号,请客吃饭当自定义信号和槽出现重载需要利用函数指针明确指向函数的地址添加新文件-QT-设计师界面类(.h .cpp .ui)

2301_80059433的博客 1461

Qt基础图形绘制

Qt基础图形绘制

m0_73443478的博客 589

QT开发:使用QT绘图系统

选择"File"菜单下的"New File or Project",在弹出的对话框中选择"Qt Widgets Application",然后按照向导的指示完成项目的创建。在QT开发中,我们可以利用QT的绘图系统来创建各种各样的图形和图表。可以从QT官方网站上下载并安装QT Creator,它是QT的集成开发环境,提供了图形化界面和丰富的工具来进行QT应用程序的开发。通过上述的例子,你可以根据需要进行自定义的绘图操作,并利用QT开发强大的绘图系统来创建各种各样的图形和图表。QT开发:使用QT绘图系统。

CodeVorter的博客 324

Qt | 采用自定义对话框实现对主窗口数据的实时画图

有关QChart、QChartView、QLineSeries、QValueAxis的介绍可参考链接1。准备工作需要注意以下几个地方:1、安装Qt时候要勾选QChart模块,本次实例是基于Qt5.9的,按照默认的安装流程走的,已经安装过QChart模块。2、新建项目时,生成的.pro文件默认是QT += core gui,需要将其改为QT += core gui charts引入QChart模块。自定义对话框类用于接收主窗口发送的数据,并利用数据画出二维图。主要步骤如下:1)创建Qt设计师界面类。

cp_freshman的博客 1446

【Qt 中的事件和信号槽机制】

在上面的代码中,我们通过 QObject::connect() 函数将 label1 的 textChanged 信号连接到 label2 的 setText() 槽上,这样当 label1 的文本发生变化时,label2 会自动更新为相同的文本内容。在 Qt 中,事件的处理是通过重载虚函数来实现的,这些虚函数可以在 QObject 或 QWidget 中找到。以上就是 Qt 中的事件和信号槽机制的简单介绍,由于篇幅所限,还有许多内容没有涉及到,如有兴趣可自行查阅 Qt 文档了解更多详情。

cl6789的博客 511

QT学习(7)——QT中绘图学习,画笔QPainter,画刷QBrush,类型颜色宽度的设置;高级设置,抗锯齿、移动画家;画家画图片,点击按钮移动实现

QT学习(7)——QT中绘图学习,画笔QPainter,画刷QBrush,类型颜色宽度的设置;高级设置,抗锯齿、移动画家;画家画图片,点击按钮移动实现

Arya的博客,专注后端领域 1912

Qt 信号槽的应用(三)

信号槽传递自定义结构体,以点餐UI为例子。

u011186532的专栏 628

精通QT图形界面编程:绘图程序实战

Qt是一个跨平台的应用程序和用户界面框架,广泛应用于开发具有复杂界面的软件应用程序。通过简单的”Hello World”程序,我们可以快速了解到如何在Qt环境里编写程序。Qt支持多种操作系统,包括Windows、Linux、macOS,甚至是嵌入式设备。安装Qt需要下载安装器并遵循安装向导。QPainter类是Qt中用于绘图的核心类,它提供了丰富的接口来绘制各种基本图形,如线条、矩形、椭圆、多边形等,并且可以用于渲染文本、图像以及向量图形。

weixin_42234168的博客 1057

QPainter使用方法总结

Qpainter使用方法总结

漫步者 1239

Python实战:超分辨率图像质量评估全攻略——PSNR、SSIM、LPIPS与NIQE的代码实现与优化

本文详细介绍了在Python中实现超分辨率图像质量评估的完整方案,涵盖PSNR、SSIM、LPIPS和NIQE四大核心指标。通过模块化代码设计、多进程并行处理和GPU加速优化,帮助开发者构建高效、可扩展的评估系统,并提供了实战避坑指南与结果解读方法。

weixin_29053073的博客 475

AIDD-人工智能药物设计-构建基于机器学习方法的在线预测平台高准确预测药物诱导骨毒性

在此基础上,提取多种药物分子特征,包括分子指纹(如MACCS、Morgan、RDKit、TopologicalTorsion、AtomPairs与Descriptors)及分子图谱,通过Transformer编码器与神经网络进行机器学习模型训练。最后,将训练好的模型部署为在线Web服务器(BoneToxPD),供用户快速预测药物的骨毒性。本研究不仅在骨毒性预测的准确性方面取得了突破,还在模型解释性方面提供了新的视角,通过注意力机制精准识别出影响骨毒性的关键化学基团,推动药物研发领域更安全、更高效的发展。

itwangyang520的博客 1081

QT入门看这一篇就够了——超详细讲解(40000多字详细讲解,涵盖qt大量知识)

QT入门看这一篇就够了——超详细讲解(40000多字详细讲解,涵盖qt大量知识),不会私信我,给你解答

m0_65635427的博客 44万+

publisher与subscriber话题的消息类型md5sum不一致问题

[ERROR] [1604235557.591296096]: Client [/range_vision_fusion_01] wants topic /detection/vision_objects to have datatype/md5sum [autoware_msgs/DetectedObjectArray/13415342e539aa36ea9a6f04ffaf39b4], but our version has [autoware_msgs/DetectedObjectArray/c16a

cxhmike的博客 6620

(七)QT——消息事件机制&绘图&文件

消息事件机制:通过事件循环和事件处理函数来响应用户输入。绘图:使用QPainterQPixmap和等类绘制图形、文本和图像。文件操作:通过QFile和QDir类来处理文件和目录的读写及选择。这些功能为你在 QT 中开发丰富的 GUI 应用程序提供了强大的支持。

qq_53589322的博客 1210

简单易懂的AXI_Lite 总线详解

简单易懂的AXI_Lite 总线详解 1、前言 AXI_LITE协议主要应用于Xilinx的ZYNQ芯片构架下的ARM和FPGA之间的数据读写,更偏向于单个寄存器的读写。 2、AXI总线与ZYNQ的关系 AXI(Advanced eXtensible Interface)本是由ARM公司提出的一种总线协议,Xilinx从6系列的FPGA开始对AXI总线提供支持,此时AXI已经发展到了AXI4这个版本,所以当你用到Xilinx的软件的时候看到的都是“AIX4”的IP,如Vivado打包一个AXI IP的时候,

m0_46642108的博客 8498

Python----PyQt开发(PyQt高级:事件机制:鼠标事件,键盘输入事件,绘图事件,关闭事件,定时器事件)

Python----PyQt开发(PyQt高级:事件机制:鼠标事件,键盘输入事件,绘图事件,关闭事件,定时器事件)

weixin_64110589的博客 1489

【unity知识】最新的虚拟相机Cinemachine3简单使用介绍

本文介绍了Unity中Cinemachine 3虚拟相机系统的使用方法。相比旧版本,新版功能更强大且参数分类更直观。文章详细讲解了摄像机镜头参数、旋转控制(包括None、目标跟随、样条线推拉、旋转追随等6种模式)和位置控制(跟随、样条轨道、硬锁定等5种模式)。重点演示了样条轨道摄像机的创建与配置,以及如何实现第一人称和第三人称视角。通过丰富的GIF图示,展示了各种模式的运行效果,帮助用户快速掌握Cinemachine 3的核心功能。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 866

Qt专栏之事件初识(十三)

事件QEvent一、事件QEvent是个啥?二、定时器事件 QTimerEvent三、绘图事件 一、事件QEvent是个啥? 通过专栏的上篇《信号与槽》初步了解了信号槽的机制,本质上信号与槽属于事件,信号是信号事件,而槽对应的则是进行处理的回调函数。 事件由系统或者Qt本身发出。例如当用户按下鼠标、敲下键盘、定时器计时等情况,都会发出一个相应的事件。然后可直接在对应的事件处理函数中进行处理。 类比于信号与槽的机制就是事件本身是信号,事件处理函数类比于槽函数来理解。 常用的事件(向右滑动➡️) 对

Time to Forget 1386

从零到多智能体:Google Agent开发套件(ADK)入门指南

ADK促进自定义工具生产的能力是其优势之一。本质上,工具只是一个带有描述性文档字符串的Python函数。

独立开发,substack顶级编辑 2491

YOLOv11【第二章:核心模块进阶篇·第3节】LDConv线性可变形卷积改进YOLOv11!

🏆 本文收录于专栏 《YOLOv11实战:从入门到深度优化》。本专栏围绕 YOLOv11 的改进、训练、部署与工程优化 展开,系统梳理并复现当前主流的 YOLOv11 实战案例与优化方案,内容目前已覆盖 分类、检测、分割、追踪、关键点、OBB 检测 等多个方向。

**My Coding Family** 7441

【Qt 学习笔记】

Qt基本入门,连接槽,界面搭建,控件操作、项目搭建,消息与事件机制。

独上高楼,望尽天涯路。 2109

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【C++】Qt:Qt事件介绍与正弦曲线绘制示例

Qt事件介绍与正弦曲线绘制示例

DevFrank的博客 1770

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

54黑马QT笔记之使用Qt5版本进行线程画图

54黑马QT笔记之使用Qt5版本进行线程画图 1 线程绘图例子 这里我们使用Qt5版本进行线程绘图,该例子不算难,步骤就是上一篇文章的步骤。这里只需要注意一下,当我们从子线程处理完数据后,通过信号传参将画好的数据image传出来,赋值给主线程的image(两者不一样),然后当主线程要在窗口绘图时,必须重写绘图事件。 2 代码 1)自定义类头文件: #ifndef MYTHREAD_H #define MYTHREAD_H #include <QObject> #include <QIma

weixin_44517656的博客 771

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

QT实现图片的滚轮缩放、框选放大、拖拽移动

序言 QT用来做界面程序是真的方便,它本身封装了很多类库,需要的时候直接拿来用就行。 QT的类继承关系网上有很多相关的文章,这里不做赘述。但是简单的界面程序最主要的继承关系还是如下图: 可以将QT的类库分为两个大类,对象和事件。对象之间的信息传递为信号,执行操作的是槽函数。事件的发生则是人机交互的过程,比如鼠标点击、鼠标滚轮滑动、键盘按键等。 算了不多说了,直接上效果图: 太累了,直接上程序程序代码: #ifndef DRAW_H #define DRAW_H #include <QWidget

GeomasterYi的博客 1万+

Qt Widgets 框架深度解析:架构、演进与现代应用

摘要:Qt Widgets框架概述 Qt Widgets是基于C++的成熟UI工具包,专为构建高性能桌面应用而设计。其核心架构包含五大支柱:QWidget基类(所有UI元素的父类)、信号与槽机制(类型安全的对象通信)、事件系统(处理用户交互)、绘图系统(通过QPainter实现精细渲染)和布局管理(自动调整界面)。Qt Widgets与Qt Quick形成互补定位:前者适用于功能密集的桌面应用,后者更适合移动端的现代界面。尽管声明式UI流行,Qt Widgets凭借其稳定性、性能优势和底层控制能力,在CAD

greenspan的专栏 966
上一篇: C语言中getchar() 和 putchar() 的用法
下一篇: OpenCV图像与视频
落啦啦
博客等级 码龄7年 4512粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值