Qt绘图与信号事件

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. 运行展示
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/52049.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的Qt作品(9)Qt使用Cairo绘图引擎提升抗锯齿效果【开源】

之前写了一篇文章《Qt使用GDI绘图&#xff08;仅Windows平台&#xff09;》 Qt使用GDI绘图&#xff08;仅Windows平台&#xff09;_libaineu2004的博客-CSDN博客 本篇重点介绍Cairo绘图引擎&#xff0c;Qt自带的QPainter的绘图效率和抗锯齿效果都没有cairo的好。cairo 的目标…

基于Qt的多媒体综合应用程序设计(2)

框架结构图等 1.多媒体综合应用程序设计思路 首先创建一个Qt Widgets Application程序,在头文件中完成类、函数及变量的设置,在程序窗口中添加相应的控件,利用控件的属性和方法分别实现文字处理程序跳转、绘图程序跳转、图像处理程序跳转、音频播放器跳转、视频播放器跳转和…

VS+Qt+鼠标框选后掩膜去除背景

前言&#xff1a; 实际采集的图片背景比较复杂&#xff0c;所以我想着采用框选矩形框掩膜的方式简单粗暴的消除背景对图片有用区域的干扰。网上搜索了一圈尝试了几种不同的方式去框选&#xff0c;最后发现还是Qt的鼠标事件比较容易上手。 效果图&#xff1a; 主要思路&#x…

QT—3D绘图

OpenGL是一个跨平台的、用来渲染3D图形的标准API,Qt对OpenGL提供了强大的支持。Qt4时代的QtOpenGL模块在Qt5中已经不再建议使用,OpenGL相关的类被移到了Qt GUI模块。Qt Widgets模块中的QOpenGLWidget类提供了一个可以渲染OpenGL图形的部件&#xff0c;通过该部件可以轻松地将Op…

【Qt】Qt环境配置与入门案例

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Qt环境配置与入门。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&…

(三)NI采集卡应用学习:在Qt中实现多路数据的同时采集、显示、绘图及存储

1、使用NI MAX创建多路输入的测量任务 本处设置Dev1/ai0:3四路电压输入&#xff0c;采样率均为100&#xff0c;差分连接。 2、代码 // 设置地址 void Widget::on_add_pushButton_clicked() {address_txt QFileDialog::getExistingDirectory(this, tr("Open Directory&q…

linux程序框架设计,《Linux与Qt程序设计》知识框架

本文主要是通过一本书来大致了解Qt开发的框架,不对具体内容做详细分析。 1.首先弄清楚概念:定义->以自己的话理解是什么-> 实现的是什么功能->用在哪些地方 2.前面认识到的知识点的特点-> 代码实现-> 工程代码分析 第一部分 Linux基础知识 第二部分 Qt程序基础…

QT开发应用程序(11)--图形绘制和文本输出

代码演示&#xff1a; #include <QPainter> MyDraw::MyDraw(QWidget *parent) :QWidget(parent) {QLinearGradient linearGradient(0,0,400,400);linearGradient.setColorAt(0.0,Qt::white);linearGradient.setColorAt(0.2,QColor(0,0,0));linearGradient.setColorAt(1.…

chatgpt赋能python:使用Python捕获错误:为您的代码添加可靠性

使用Python捕获错误&#xff1a;为您的代码添加可靠性 在编写Python代码时&#xff0c;错误很常见。您可能会因输入无效参数而收到TypeError&#xff0c;或者因无法连接到数据库而收到ConnectionError。当这些错误发生时&#xff0c;您的代码可能会崩溃或产生不正确的结果。尽…

chatgpt赋能python:关闭Python:如何优雅地退出一个Python程序

关闭Python&#xff1a;如何优雅地退出一个Python程序 Python作为一门开发语言&#xff0c;可以广泛应用于众多领域&#xff0c;如数据科学、人工智能、Web应用开发等等。但有时候&#xff0c;我们需要关闭一个正在运行的Python程序。本文将介绍如何优雅地退出一个Python程序&…

chatgpt赋能python:Python异常捕获存在的问题

Python 异常捕获存在的问题 作为一门广受欢迎、应用广泛的编程语言&#xff0c;Python 在处理异常方面有着比较完善的设计。Python 提供了 try…except…finally 这样的异常处理机制&#xff0c;通过这些机制&#xff0c;开发者可以捕获、处理程序中产生的异常&#xff0c;从而…

yagmail——快速发送邮件

yagmail——快速发送邮件 目标&#xff1a;如何利用python中的yagmail包&#xff0c;快速发送邮件。 python写的一个简单demo脚本代码如下&#xff1a; import yagmail import pandas as pd from loguru import logger# 保存excel文件 contents pd.DataFrame() contents[&quo…

电脑和微信怎么发邮件到别人邮箱,企业邮箱如何发email给别人

邮箱已成为主流的办公软件&#xff0c;除了日常的电脑办公使用以外&#xff0c;你知道还有哪些便捷的方式使用邮箱吗&#xff1f;现在是互联网时代&#xff0c;许多邮箱都研发了手机邮箱配合使用&#xff0c;那TOM企业邮箱有哪些便捷的服务呢&#xff1f;一起看看吧&#xff01…

怎么发送电子邮件到别人邮箱?手把手教你!

在日常生活中&#xff0c;我们在工作学习的时候都离不开电子邮件&#xff0c;无论两人的距离有多远&#xff0c;都是可以通过电子邮件的方式完成信息的即时传递。这样不仅可以传输文字信息&#xff0c;还能传输图片、视频等多种格式的信息。那么&#xff0c;怎么发送电子邮件到…

chatgpt赋能Python-pythonapp自动化

Python App自动化&#xff1a;优化SEO的终极解决方案 随着互联网的发展&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;变得日益重要。对于任何网站或应用程序开发人员来说&#xff0c;SEO应该是一个非常重要的考虑因素。为了帮助开发人员和企业提高其在线可见性&#x…

chatgpt赋能python:Python自动化断言介绍

Python 自动化断言介绍 软件业的各种应用程序不可避免地需要与用户进行交互。测试团队应该确保这些应用程序快速&#xff0c;可靠地响应用户交互&#xff0c;并注重高质量测试的策略和工具。Python自动化断言是一种测试策略&#xff0c;可帮助团队实现高品质和高效率的测试。P…

chatgpt赋能python:Python自动化操作桌面的方法和应用

Python自动化操作桌面的方法和应用 Python是一种高级编程语言&#xff0c;越来越多的研究人员和程序员将其应用在自动化操作任务上。本文将向您介绍如何利用Python自动化操作桌面并且展示一些实际应用。 桌面自动化操作是什么&#xff1f; 桌面自动化操作是使用编程语言编写…

chatgpt赋能python:Python表格自动化:优化你的数据处理工作效率

Python表格自动化&#xff1a;优化你的数据处理工作效率 作为一名有10年Python编程经验的工程师&#xff0c;我深切体会到编程能够为我们带来的高效和便利。其中&#xff0c;Python在数据分析和处理方面的优势尤为突出。本文将从Python表格自动化的角度&#xff0c;为大家介绍…

chatgpt赋能python:Python如何自动化办公

Python如何自动化办公 随着信息技术的不断发展和进步&#xff0c;自动化技术已经在各行各业得到了广泛的应用。作为一种高级编程语言&#xff0c;Python在自动化办公领域发挥了重要的作用。下面&#xff0c;我们来详细了解一下Python如何自动化办公。 什么是Python自动化办公…

chatgpt赋能Python-python_gui自动化点击

简介 Python是一种功能强大的编程语言&#xff0c;它的广泛应用让许多企业都使用了这种语言来编写脚本&#xff0c;编写小型应用程序和构建自动化工作流程。其中&#xff0c;Python GUI自动化成为了越来越普遍的需求。Python可以使用多种GUI库&#xff0c;例如PyQt、Tkinter和…