qt 5.15.2 主窗体事件及绘制功能

qt 5.15.2 主窗体事件及绘制功能

显示主窗体效果图如下所示:
在这里插入图片描述

main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.setFixedWidth(600);
    w.setFixedHeight(600);
    w.show();
    //w.showMaximized(); //最大化显示后,再添加布局部件
    return a.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    //
    void print(QString msg);
    void DrawBorad();
    void DrawTipText();
    void PrintMsg(int x,int y,QString msg);
    void line(int x1,int y1,int x2,int y2);
    void circle(int x,int y,int radius);
    //qt 绘制事件
    void paintEvent(QPaintEvent *event);
    //qt mouse event
    void mousePressEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void keyPressEvent(QKeyEvent *event);
    void wheelEvent(QWheelEvent *event);
    void resizeEvent(QResizeEvent *event);


    //
    void DrawPiece();

private:
    Ui::MainWindow *ui;    
    bool isMousePressed=false;
    QPoint currentPoint;
    char Current_piece='O';
    //初始化
    char Board_piece[3][3]=
    {
        {'_','_','_'},
        {'_','_','o'},
        {'_','_','x'}
    };
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qpainter.h>
#include <iostream>
#include <QDebug>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QWheelEvent>
#include <QResizeEvent>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //mouse move event setup must two line OK
    this->setMouseTracking(true);
    ui->centralwidget->setMouseTracking(true);
    //
}

MainWindow::~MainWindow()
{
    delete ui;    
}

void MainWindow::print(QString msg)
{
    qDebug()<<msg;
    //std:cout<<msg.toStdString()<<std::endl;
}

void MainWindow::DrawBorad()
{
    line(0,200,600,200);   //c
    line(0,400,600,400);   //d
    line(200,0,200,600);  //a
    line(400,0,400,600);   //b
}

void MainWindow::line(int x1,int y1,int x2,int y2)
{
    QPainter painter(this);
    painter.drawLine(x1,y1,x2,y2);
}

void MainWindow::circle(int x,int y,int radius)
{
    QPainter painter(this);
    painter.drawEllipse(QPoint(x,y),radius,radius);
}


void MainWindow::DrawTipText()
{
    QPainter painter(this);
    //static TCHAR str[64];
    //_stprintf_s(str,_T("当前棋子类型:%c"),Current_piece);
    //settextcolor(RGB(255,175,45));
    //outtextxy(0,0,str);
    QPen pen;
    pen.setWidth(2);//设置线宽
    pen.setStyle(Qt::SolidLine);//样式
    pen.setColor(QColor(255,0,0));//文字颜色
    painter.setPen(pen);
    QString msg=QString::asprintf("当前棋子类型:%c",Current_piece);
    painter.drawText(10, 15, msg);//文本内容
}

void MainWindow::PrintMsg(int x,int y,QString msg)
{
    QPainter painter(this);
    //static TCHAR str[64];
    //_stprintf_s(str,_T("当前棋子类型:%c"),Current_piece);
    //settextcolor(RGB(255,175,45));
    //outtextxy(0,0,str);
    QPen pen;
    pen.setWidth(2);//设置线宽
    pen.setStyle(Qt::SolidLine);//样式
    pen.setColor(QColor(255,45,100));//文字颜色
    painter.setPen(pen);
    painter.drawText(x, y, msg);//文本内容
}

void MainWindow::DrawPiece()
{
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            switch(this->Board_piece[i][j])
            {
              case 'O':
              case 'o':
                this->circle(200*j+100,200*i+100,100);
                break;
              case 'x':
              case 'X':
              {
                  int x=200*j;
                  int y=200*i;
                  line(x,y,x+200,y+200);   //左对角线(x,y)-(x+100,y+100)
                  line(x+200,y,x,y+200);   //右对角线(x+100,y)-(x,y+100)
              }
              break;
              case '_':
              case '-':
                  break;
            }
        }
    }
}

//总绘制事件
void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    //反走样
    painter.setRenderHint(QPainter::Antialiasing, true);
    //画背景图

    QString jpgPath="E:\\cwgis_qt\\hsg\\qi_three_son\\images\\china_hdz.jpg";

    painter.drawPixmap(0,0, 600, 600, QPixmap(jpgPath));

    //定义画笔
    QPen pen;
    pen.setWidth(2);//设置线宽
    pen.setColor(QColor(222,255,55));//颜色
    pen.setStyle(Qt::SolidLine);//样式
    //画刷
    QBrush brush;
    brush.setColor(Qt::black);//颜色
    brush.setStyle(Qt::SolidPattern);//样式
    //设置画笔画刷
    painter.setPen(pen);
    painter.setBrush(brush);
    //画直线
    painter.drawLine(50,50,150,50);
    painter.drawLine(20,50,250,150 );
    //画矩形
    painter.drawRect(70,200,100,50);
    //画椭圆
    painter.drawEllipse(QPoint(270,150),50,80);

    //画文字
    QFont font;
    font.setFamily("MV Boli");//文字字体
    font.setPixelSize(20);//文字大小
    pen.setColor(QColor(255,55,255));//文字颜色
    painter.setFont(font);
    painter.setPen(pen);
    painter.drawText(200, 300, "Qt Creator 12.0.0 (opensource)");//文本内容
    //
    this->DrawBorad();
    this->DrawPiece();
    //
    this->DrawTipText();
    this->PrintMsg(20,30,jpgPath);
    this->PrintMsg(20,40,qApp->applicationDirPath());  //获取可执行文件所在目录
    //
    {
       QString msg=QString::asprintf("%d,%d",this->currentPoint.x(),this->currentPoint.y());
       this->PrintMsg(40,580,"(x,y)="+msg);
    }
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    this->isMousePressed=true;
    print("pressed mouse");
    this->update();
}
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    this->isMousePressed=false;
    print("unpresse mouse");
    this->update();
}

void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    QPoint p=event->pos();
    this->currentPoint=p;
    qDebug()<<"pos="<<p;   //需要引用#include <QMouseEvent>
    //QString msg=QString::asprintf("%d,%d",p.x(),p.y());
    //this->PrintMsg(40,300,"(x,y)="+msg);
    //qDebug()<<msg;
    if(this->isMousePressed)
    {
        QString msg=QString::asprintf("%b",this->isMousePressed);
        this->PrintMsg(570,40,"isMousePressed="+msg);

    }
    else
    {
        QString msg=QString::asprintf("%b",this->isMousePressed);
        this->PrintMsg(570,40,"isMousePressed="+msg);
    }
    print("moveing mouse");
    this->update();   //更新触发重绘事件paintEvent 才能动态显示当前点坐标(x,y)=100,200
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    qDebug()<<"key: "<<event->key();
    this->update();
}
void MainWindow::wheelEvent(QWheelEvent *event)
{
    qDebug()<<"wheel: "<<event->angleDelta();
    this->update();
}

void MainWindow::resizeEvent(QResizeEvent *event)
{
    qDebug()<<"resize: "<<event->size();
    this->update();
}




本blog地址:https://blog.csdn.net/hsg77

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java学习part34collect和map

153-集合框架-数组的特点、弊端与集合框架体系介绍_哔哩哔哩_bilibili 1.以前的数组 2.常用 3.Collection add只能加object&#xff0c;如果有基本类型会装箱 3.2集合和数组转换 3.3往集合添加对象的注意事项 4.迭代器 容易越界 一般不用 常用好用 5.for each 类似c的for( …

鸿蒙4.0开发笔记之ArkTS装饰器语法基础之监听者模式@Watch案例讲解(十四)

1、Watch定义 Watch实际是指状态变量更改通知。如果开发者需要关注某个状态变量的值是否改变&#xff0c;可以使用Watch为状态变量设置回调函数&#xff08;监听函数&#xff09;。 Watch用于监听状态变量的变化&#xff0c;当状态变量变化时&#xff0c;Watch的回调方法将被…

Hadoop实验putty文件

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 很多朋友反馈做hadoop实验中的putty找不到Connection-SSH-Auth路径下找不到Private key for authentication私有密钥&#xff0c;无法将转…

非标设计之气缸类型

空压机&#xff1a; 空压机又称空气压缩机&#xff0c;简单来说就是将机械能转化为压力能来进行工作的&#xff0c;空压机在电力行业应用比较多&#xff0c;除了在电力行业应用较多外&#xff0c;其实空压机还有一个比较常见的用途就是用来制冷和分离气体&#xff0c;输送气体…

EM32DX-C4【C#】

1外观&#xff1a; J301 直流 24V 电源输入 CAN0 CAN0 总线接口 CAN1 CAN1 总线接口 J201 IO 接线段子 S301-1、S301-2 输出口初始电平拨码设置 S301-3~S301-6 模块 CAN ID 站号拨码开关 S301-7 模块波特率拨码设置 S301-8 终端电阻选择开关 2DI&#xff1a; 公共端是…

Gson 自动生成适配器插件

在json解析方面 我们常见有下面几方面困扰 1. moshi code-gen能自动生成适配器,序列化效率比gson快,但是自定义程度不如gson,能java kotlin共存 且解决了默认值的问题 2.gson api 强大自由,但是 第一次gson的反射缓存比较慢,而且生成对象都是反射,除非主动注册com.google.gson…

SQL Sever 基础知识 - 数据筛选(1)

SQL Sever 基础知识 - 四、数据筛选 四、筛选数据第1节 DISTINCT - 去除重复值1.1 SELECT DISTINCT 子句简介1.2 SELECT DISTINCT 示例1.2.1 DISTINCT 一列示例1.2.2 DISTINCT 多列示例 1.2.3 DISTINCT 具有 null 值示例1.2.4 DISTINCT 与 GROUP BY 对比 第2节 WHERE - 过滤查询…

翻译: 生成式人工智能的工作原理How Generative AI works

ChatGPT 和 Bard 等系统生成文本的能力几乎像魔法一样。它们确实代表了 AI 技术的一大步进。但是文本生成到底是如何工作的呢&#xff1f;在这个视频中&#xff0c;我们将看看生成式 AI 技术的底层原理&#xff0c;这将帮助你理解你可以如何使用它&#xff0c;以及何时可能不想…

免费的SEO外链发布工具,提升排名的利器

互联网已经成为信息传播和商业发展的重要平台。而对于拥有网站的个人、企业来说&#xff0c;如何让自己的网站在搜索引擎中脱颖而出&#xff1f;SEO&#xff08;Search Engine Optimization&#xff09;作为提高网站在搜索引擎中排名的关键手段. 什么是SEO外链&#xff1f; S…

【数据结构】最短路径——Floyd算法

一.问题描述 给定带权有向图G&#xff08;V&#xff0c;E&#xff09;&#xff0c;对任意顶点 V &#xff08;ij)&#xff0c;求顶点到顶点的最短路径。 转化为&#xff1a; 多源点最短路径求解问题 解决方案一&#xff1a; 每次以一个顶点为源点调用Dijksra算法。时间复杂…

根据已有安装的cuda配置合适的pytorch环境

目前网络上根据电脑配置安装合适的深度学习环境的帖子已经很多了&#xff0c;但是现实中会出现很久之前已经安装了对应的cuda&#xff0c;但是现在忘记了当时安装的是什么版本。本文针对这一问题展开攻略。 1 cuda安装版本查询 我们在查询自己应该安装什么版本的cuda时&#…

前端——html拖拽原理

文章目录 ⭐前言⭐draggable属性&#x1f496; api&#x1f496; 单向拖动示例&#x1f496; 双向拖动示例 ⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端——html拖拽原理。 vue3系列相关文章&#xff1a; vue3 fastapi 实现选择目录所有文…

仅 CSS 阅读进度条

为了构建一个阅读进度条&#xff0c;即显示用户向下滚动时阅读文章的进度&#xff0c;很难不考虑 JavaScript。但是&#xff0c;事实证明&#xff0c;您也可以使用纯 CSS 构建阅读进度条。 从本质上讲&#xff0c;一个名为 animation-timeline 的新实验性 CSS 属性可以让你指定…

【工具使用-Audition】如何使用Audition频谱分析

一&#xff0c;简介 本文以Audition 2020为例&#xff0c;介绍如何生成频谱分析的图像。 二&#xff0c;操作步骤 使用快捷键“shift D” 三&#xff0c;总结 本文主要介绍如何查看频谱分析&#xff0c;供参考。

dll动态链接库【C#】

1说明: 在C#中,dll是添加 【类库】生成的。 2添加C#的dll: (1)在VS中新建一个Windows应用程序项目,并命名为TransferDll。 (2)打开Windows窗体设计器,从工具箱中为窗体添加相应的控件。 (3)在该应用程序的“解决方案资源管理”中的“引用”文件上单击鼠标右键, 在…

沐风老师3DMAX拼图随机生成器Puzzle建模工具使用教程

3DMAX拼图随机生成器Puzzle建模工具使用教程 3DMAX拼图随机生成器Puzzle&#xff0c;是一款用MAXScript脚本语言开发的3dsMax小工具&#xff0c;可以随机创建可编辑多边形3D拼图对象。可批量生成阵列。 【适用版本】 3dMax2015-2024&#xff08;不仅限于此范围&#xff09; 【…

【Unity动画】Unity 动画播放的流程

本文以2D为案例&#xff0c;讲解Unity 播放动画的流程 准备和导入2D动画资源 外部导入序列帧生成的 Unity内部制作的 外部导入的3D动画 2.创建动画过程 打开时间轴Ctrl6 选中场景中的一个未来需要播放动画的物体 回到时间轴点击Create一个新动画片段 拖动2D动画资源放入…

探索图像生成中的生成对抗网络 (GAN) 世界

一、介绍 生成对抗网络&#xff08;GAN&#xff09;的出现标志着人工智能领域的一个重要里程碑&#xff0c;特别是在图像生成领域。GAN 由 Ian Goodfellow 和他的同事于 2014 年提出&#xff0c;代表了机器学习中的一种新颖方法&#xff0c;展示了生成高度逼真和多样化图像的能…

专业做除甲醛净化器的品牌 甲醛净化器什么牌子最好用

室内产生了超标的甲醛&#xff0c;大部分都会采取选择甲醛空气净化器来去除&#xff0c;甲醛净化器逐渐成为室内清除甲醛的主力&#xff0c;在选择甲醛净化器时&#xff0c;人们常常会被市场上琳琅满目的空气净化器品牌所迷惑&#xff0c;各品牌和型号都声称自己最好&#xff0…

❀dialog命令运用于linux❀

目录 ❀dialog命令运用于linux❀ msgbox部件&#xff08;消息框&#xff09; yesno部件&#xff08;yesno框&#xff09; inputbox部件&#xff08;输入文本框&#xff09; textbox部件&#xff08;文本框&#xff09; menu部件&#xff08;菜单框&#xff09; fselect部…