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

news2024/9/24 9:26:04

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.coloradmin.cn/o/1285287.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是 AWS IAM?如何使用 IAM 数据库身份验证连接到 Amazon RDS(下)

在《什么是 AWS IAM&#xff1f;如何使用 IAM 数据库身份验证连接到 Amazon RDS&#xff08;上&#xff09;》中我们已经阅读了有关LAM的部分内容&#xff0c;这篇在文章中我们将继续为您展开↓ dbForge Studio for MySQL是一款专业的数据库管理、开发软件&#xff0c;它能够使…

探索C++14新特性:更强大、更高效的编程

探索C14新特性&#xff1a;更强大、更高效的编程 C14并没有太大的改动&#xff0c;就连官方说明中也指出&#xff0c;C14相对于C11来说是一个比较小的改动&#xff0c;但是在很大程度上完善了C11&#xff0c;所以可以说C14就是在C11标准上的查漏补缺。 C14在2014年8月18日正式…

Qt篇——QChartView实现鼠标滚轮缩放、鼠标拖拽平移、鼠标双击重置缩放平移、曲线点击显示坐标

话不多说。 第一步&#xff1a;自定义QChartView&#xff0c;直接搬 FirtCurveChartView.h #ifndef FITCURVECHARTVIEW_H #define FITCURVECHARTVIEW_H #include <QtCharts>class FitCurveChartView : public QChartView {Q_OBJECTpublic:FitCurveChartView(QWidget *…

apk反编译修改教程系列---简单去除apk开屏广告【五】

往期教程&#xff1a; apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 apk反编译修改教程系列---简单…

算法学习—排序

排序算法 一、选择排序 1.算法简介 选择排序是一个简单直观的排序方法&#xff0c;它的工作原理很简单&#xff0c;首先从未排序序列中找到最大的元素&#xff0c;放到已排序序列的末尾&#xff0c;重复上述步骤&#xff0c;直到所有元素排序完毕。 2.算法描述 1&#xff…

Linux中项目部署步骤

安装jdk&#xff0c;tomcat 安装步骤 1&#xff0c;将压缩包&#xff0c;拷贝到虚拟机中。 通过工具&#xff0c;将文件直接拖到虚拟机的/home下 2&#xff0c;回到虚拟机中&#xff0c;查看/home下&#xff0c;有两个压缩文件 3&#xff0c;给压缩文件做解压缩操作 tar -z…

分享70个节日PPT,总有一款适合您

分享70个节日PPT&#xff0c;总有一款适合您 70个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1IRIKuFoGjQJ14OVkeW_mDQ?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

Nuxt3 使用 pinia 基础

官方文档 一、安装 pnpm add pinia/nuxt二、配置 添加到 nuxt.config.js 中的 modules &#xff08;Nuxt 3&#xff09;或 buildModules &#xff08;Nuxt 2&#xff09;&#xff1a; // Nuxt 2 export default {buildModules: [[pinia/nuxt, { disableVuex: true }]], } /…

MySQL-含json字段表和与不含json字段表查询性能对比

含json字段表和与不含json字段表查询性能对比 说明: EP_USER_PICTURE_INFO_2:不含json字段表 20200729json_test:含有json字段表 其中20200729json_test 标准ID、MANAGER_NO、PHONE_NO 为非json字段 data为json字段 2个表中MANAGER_NO、PHONE_NO都创建了各自的索引 测试…

拼多多电商平台API接口,获取拼多多实时准确数据,获取产品销量、价格,sku图片及sku库存数据演示

拼多多商品详情API接口的作用是让开发者可以获取拼多多平台上特定商品的详细信息&#xff0c;包括商品的标题、价格、图片、规格、参数以及店铺信息等。通过这个接口&#xff0c;开发者可以轻松地获取商品的原始数据&#xff0c;便于进行数据分析、价格比较、爬取等操作。这为电…

python和php语言编写大型爬虫那个更适用 ?

以我多年从事爬虫行业的经验来说&#xff0c;其实python和php两种语言都可以用于编写大型爬虫项目&#xff0c;但是因为Python语言简洁方便&#xff0c;第三方库相比有很多&#xff0c;数据处理能力也很强&#xff0c;所以受到大多数程序员的追捧。 Python和PHP都可以用于编写…

32位旧内核2038溢出time记录

项目中有使用arm32的机器 现在内核动不了 有个使用时间范围显示是2023-2123 int在32bit下的 2038危机诞生了。 下面在svn找到代码 优化了一下 供大家学习哈&#xff0c;废话不多说直接上家伙&#xff1a; 需要的函数自己抄 #pragma once #include <stdio.h> #include …

Java 并发编程面试题——Java 线程间通信方式

目录 1.✨Java 线程间有哪些通信方式&#xff1f;1.1.volatile 和 synchronized 关键字1.2.等待/通知机制1.2.1.概述1.2.2.经典范式 1.3.管道输入/输出流1.4.信号量 2.Thread.join() 有什么作用&#xff1f;它的使用场景是什么&#xff1f;3.Java 中需要主线程等待子线程执行完…

家用打印机品牌多,种类杂,那么如何挑选最适合的家用打印机

在购买最好的家用打印机时&#xff0c;你可能会寻找足够多功能的打印机来满足每个人的需求。你的家人可能需要复印文件签字&#xff0c;扫描精致的旧照片&#xff0c;或者在接到通知后立即打印长篇文章或报告。良好的扫描功能确保你可以快速高效地将工作数字化&#xff0c;而每…

工程化使用React

安装 首先全局安装 npm install create-react-app -g创建项目 create-react-app proName最基本的一个react工程化创建完成 项目目录

CRM:如何通过客户数据分析获得业务洞察?

客户数据分析&#xff0c;也称客户分析&#xff0c;是收集、组织和分析客户数据&#xff0c;以深入了解客户行为的过程。企业将利用这些数据来制定与营销、产品开发、销售等相关的业务决策。 通过客户分析&#xff0c;你可以做出简单的业务决策&#xff0c;比如找出投资回报率…

基于PaddleSeg开发的人像抠图web api接口

前言 基于PaddleSeg开发的人像抠图web api接口&#xff0c;提取官方代码&#xff0c;适配各种系统&#xff0c;通过api的接口进行访问。 环境要求 1、Python3.7以上 2、源码&#xff08;文章最后下载&#xff09; 源码结构 测试module.py中添加如下代码&#xff1a; if __na…

城市内涝监测如何防治

洪涝灾害是我国历史上主要自然灾害之一&#xff0c;由于我国大部分地区受季风气候影响和降水季节性分配和空间分布不平衡等因素&#xff0c;一些城市洪涝灾害易发多发&#xff0c;危及城市居民的生命财产安全&#xff0c;也影响城市安全运行和可持续发展。因此&#xff0c;城市…

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 - 过滤查询…