QT/C++——主窗口和事件处理

news2024/11/15 22:42:07

一、主窗口

上面就是一个主窗口,主窗口中的每一个都是Action 

 

这次新建工程要选择mainwindow

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QAction>
#include <QTextEdit>
#include <QLabel>
#include <QFileDialog>
#include <QColorDialog>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
public slots:
    void openf()
    {
        QString filename = QFileDialog::getOpenFileName();
        te->setText(filename);
    }

    void copyf()
    {
        te->copy();
    }

    void pastf()
    {
        te->paste();
    }

    void setcf()
    {
        QColor ccc = QColorDialog::getColor();
        te->setTextColor(ccc);
    }
private:
    QAction *openfileact;

    QAction *copyfileact, *pastfileact;

    QAction *setcoloract;

    //central
    QTextEdit *te;

    //status
    QLabel *slb;
};

#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <QMenu>
#include <QMenuBar>
#include <QToolBar>
#include <QStatusBar>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //create actions
    openfileact = new QAction(QIcon("open.png"), "open");
    openfileact->setShortcut(QKeySequence(tr("Ctrl+O")));

    copyfileact = new QAction(QIcon("copy.png"),"copy");
    pastfileact = new QAction(QIcon("past.png"),"past");

    setcoloract = new QAction(QIcon("color.png"),"setcolor");

    //create meu
    QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
    fileMenu->addAction(openfileact);

    QMenu *editMenu = menuBar()->addMenu(tr("&Edit"));
    editMenu->addAction(copyfileact);
    editMenu->addAction(pastfileact);

    QMenu *setMenu = menuBar()->addMenu(tr("&Set"));
    setMenu->addAction(setcoloract);


    //create toolbars
    QToolBar *tfile = addToolBar("file");
    tfile->addAction(openfileact);
    QToolBar *tedit = addToolBar("edit");
    tedit->addAction(copyfileact);
    tedit->addAction(pastfileact);
    QToolBar *tset = addToolBar("set");
    tset->addAction(setcoloract);

    //cenctral
    te = new QTextEdit("hello");
    te->setMinimumSize(640, 480);
    setCentralWidget(te);

    //statures
    slb = new QLabel("1.txt*");
    QStatusBar *stb = statusBar();
    stb->addWidget(slb);

    connect(openfileact, SIGNAL(triggered(bool)), this, SLOT(openf()));
    connect(copyfileact, SIGNAL(triggered(bool)), this, SLOT(copyf()));
    connect(pastfileact, SIGNAL(triggered(bool)), this, SLOT(pastf()));
    connect(setcoloract, SIGNAL(triggered(bool)), this, SLOT(setcf()));

}

MainWindow::~MainWindow()
{

}

 运行后是这样的,

 

还可以使用快捷方式并且有小图标。 

 

可以复制黏贴设置颜色,反正需要什么加什么就好了

二、事件

2.1事件处理 

 

定时器一秒输出一次

 

鼠标点击记录位置

滑轮滚动输出正负,按键输出的是标号不是具体的按下了什么

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QMouseEvent>//鼠标
#include <QKeyEvent>//键盘
#include <QWheelEvent>//滚轮


class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
    void mousePressEvent(QMouseEvent *event)
    {
        qDebug()<<"pressssss: "<<event->pos();

    }

    void mouseMoveEvent(QMouseEvent *event)
    {
        qDebug()<<"moving!"<<event->pos();
    }

    void keyPressEvent(QKeyEvent *event)
    {
        qDebug()<<"key: "<<event->key();
    }

    void wheelEvent(QWheelEvent *event)
    {
        qDebug()<<"wheel: "<<event->delta();
    }

    void timerEvent(QTimerEvent *event)
    {
        qDebug()<<"timer!";
    }
};

#endif // WIDGET_H

 

2.2绘图事件

可以像一个表一样是可以动的

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QPainter>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
    void paintEvent(QPaintEvent *event)
    {
        qDebug()<<"ppppppp";

        QPainter p(this);

        p.translate(this->width()/2, this->height()/2);
        p.drawEllipse(QPoint(0, 0), 100, 100);
  //      p.drawLine(0, 0, 50, 50);
        p.rotate(i++*10);
        p.drawLine(0, 0, 50, 50);
    }

    void timerEvent(QTimerEvent *event)
    {
        update();
    }

private:
    int i;
};


#endif // WIDGET_H

2.3双缓冲绘图

 

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMouseEvent>
#include <QPainter>

class Widget : public QWidget
{
    Q_OBJECT

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

    void mousePressEvent(QMouseEvent *event)
    {
        startp = event->pos();
    }

    void mouseReleaseEvent(QMouseEvent *event)
    {
        saveit = true;
        update();
    }

    void mouseMoveEvent(QMouseEvent *event)
    {
        endp = event->pos();
        update();
    }

    void paintEvent(QPaintEvent *event)
    {
        if(saveit)
        {
             QPainter px(pix);
             px.drawLine(startp, endp);
             saveit = false;
        }


        QPainter p(this);
        p.drawPixmap(0, 0, *pix);
        p.drawLine(startp, endp);
    }

private:
    QPoint startp;//起点
    QPoint endp;//终点
    QPixmap *pix;
    bool saveit;
};

#endif // WIDGET_H

双缓冲绘图其实就是把第一次的绘图用一个东西保存了一下再一起显示出来,保证之前的痕迹可以保留

2.4事件过滤器

 

 

过滤器就是对事件进行过滤的一个类,他只要是Qobject类的派生类,并且他满足一个eventFilter

上图的y就是一个过滤器,y不要的x才处理。

下面用一个照片阅读器来演示一下什么是过滤器

没啥看的看截图吧

代码有点多还是放资源里。

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

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

相关文章

LeetCode 剑指 Offer 09. 用两个栈实现队列

题目 解题 这道题是用两个栈实现一个队列&#xff0c;具有一个队尾添加元素和队头删除元素的功能 这里思路是一个进&#xff0c;一个出&#xff0c;里面的元素顺序很关键&#xff0c;要保持一个进栈最先进的元素在另一个出栈的栈顶 第一种方法是&#xff0c;每次进元素&#x…

冰冰学习笔记:信号

欢迎各位大佬光临本文章&#xff01;&#xff01;&#xff01; 还请各位大佬提出宝贵的意见&#xff0c;如发现文章错误请联系冰冰&#xff0c;冰冰一定会虚心接受&#xff0c;及时改正。 本系列文章为冰冰学习编程的学习笔记&#xff0c;如果对您也有帮助&#xff0c;还请各位…

使用Postman快速访问MemFire Cloud应用

“超能力”数据库&#xff5e;拿来即用&#xff0c;应用开发人员再也不用为撰写API而发愁。MemFire Cloud 为开发者提供了简单易用的云数据库&#xff08;表编辑器、自动生成API、SQL编辑器、备份恢复、托管运维&#xff09;&#xff0c;很大地降低开发者的使用门槛。 使用Post…

关于保研(免试攻读硕士学位研究生)的相关政策

文章目录1、保研政策是什么&#xff1f;2、哪些学校可以保研&#xff1f;3、保研的流程/名额是怎样的&#xff1f;1、保研政策是什么&#xff1f; 什么是保研&#xff1f; 官方定义&#xff1a; 保研&#xff08;全称&#xff1a;推荐优秀应届本科毕业生免试攻读硕士学位研究…

Linux基础开发环境,yum 与 vim。

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;Linux &#x1f525;<3>创作者&#xff1a;我的代码爱吃辣 &#x1f4ac;<4>前言&#xff1a;Linux必不可少的基础开发环境使用。 目录 一.Linux软件包管理器 yum &#x…

微电网经济优化运行(光伏、储能、柴油机)(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

液晶LCD1602驱动代码

液晶LCD1602简介LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏&#xff08;LCD&#xff09;、控制驱动主电路HD44780及其扩展驱动电路HD44100&#xff0c;以及少量电阻、电容元件和结构件等装配在PCB板上而组成。不同厂家生产的LCD1602芯片可能…

《数据结构》二叉树(性质and遍历)

目录 ​编辑 树的定义 概念 树的定义 二叉树的概念 满二叉树 概念 完全二叉树 概念 二叉树的性质 二叉树的遍历 先序遍历 中序遍历 后序遍历 层序遍历 树的定义 概念 树是一种非线性的数据结构 树的定义 子树是不相交的除了根节点外&#xff0c;每个节点有且仅有一个…

360度客户视频的内容和四种数据类型

提到CRM客户管理系统&#xff0c;您是不是经常听到“360度客户视图”这个词&#xff1f;所谓360度客户视图&#xff0c;让企业做到全方位地建立客户认知&#xff0c;消除客户生命周期所有的信息脱节。下面来详细讲讲&#xff0c;Zoho CRM系统的360度客户视图是什么&#xff1f;…

统计分析工具

百度统计 百度统计访问地址 https://tongji.baidu.com/web/10000370440/homepage/index 创建项目及获取项目标识 1、创建分析网站 在管理页面中点击新增网站&#xff0c;填写完信息 2、获取代码 得到如下代码&#xff1a; <script> var _hmt _hmt || []; (function…

测试开发必知必会:Pytest框架实战

应用场景&#xff1a; pytest 框架可以解决我们多个测试脚本一起执行的问题。 它提供了测试用例的详细失败信息&#xff0c;使得开发者可以快速准确地改正问题。它兼容最新版本的 Python。它还兼容 unittest、doctest 和 nose&#xff0c;开箱即用。接下来我们详细了解下pyte…

数据究竟是什么?

我们搞大数据的&#xff0c;每天都在说“数据”这个词。但是数据究竟是什么&#xff1f;其准确的定义是什么&#xff1f;可能大多数人都没有思考过这个问题。首先&#xff0c;我们来考察下数据这个词的起源。数据这个词在古汉语中是不存在的&#xff0c;而是近代以来&#xff0…

在ObjectARX(VC)中使用MFC-可停靠窗体

目录 前言 一、使用CAD的CAcUiDockControlBar类 二、在入口程序中注册命令 三、窗口实现 四、目录结构 五、注意事项 六、效果展示 前言 CAD中经常会看到这样的窗口&#xff0c;下面就看看是如何实现的。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可…

ESP-IDF:传统链表测试

ESP-IDF:传统链表测试 在ESP-IDF环境下简单地写个传统链表 /--------------Test 传统链表-------------/ //链表结点 typedef struct LINKNODE11 { void * data; LINKNODE11 * next; }linknode11; //链表头 typedef struct LINKLIST11 { linknode11 * head; int size; }linkli…

SpringBoot快速搭建WebSocket并测试

目录简介Pom文件服务端Service代码服务端配置代码服务端Controller&#xff1a;发送消息给客户端测试开启ws服务端简介 WebSocket协议通过在客户端和服务端之间提供全双工通信来进行Web和服务器的交互功能。 在ws应用程序中&#xff0c;服务器发布websocket端点。 一个ws连接的…

通用`Query`解决方案

文章目录通用Query解决方案简介什么是QueryQuery类别Query基本使用SQL Query基本使用自定义Query基本使用现状方案通过Json数据或方法动态生成Query 通过Select Sql语句动态生成Query通过Query生成动态Query支持传统的Query并通过参数形式生成Query列定义通用Query&#xff0c;…

nacos区分权限

背景 nacos的默认是不进行分配权限的&#xff0c;那么这样就带来了一个问题&#xff0c;如果多项目共同使用一个nacos&#xff0c;可以带了一个情况是开发人员误操作&#xff0c;把其他项目的nacos配置文件更改或者删除。那么如何解决这个问题呢&#xff1f;就是把nacos进行分…

TF-A源码移植

1.对tf-a源码进行解压$> tar xfz tf-a-stm32mp-2.2.r2-r0.tar.gz 2.打补丁进入/home/ubuntu/FSMP1A/tf-a-stm32mp-2.2.r2-r0/tf-a-stm32mp-2.2.r2-r0/tf-a-stm32mp-2.2.r2目录执行for p in ls -1 ../../*.patch; do patch -p1 < $p; done3.配置工具链1)进入/home/ubuntu/…

GJB 5000B二级-ESM外部供方管理

一、主要变化情况 新增3项(红色)、删除1项(黄色)、合并2项(绿色)、修订4项(蓝色) 将原标准过程域名称“供方协议管理”改为“外部供方管理”,其适应范围包括所以形式的外部提供过程、产品和服务协议,同时增加对外部供方按协议提供过程、产品和服务能力评价的内容,…

小偷和抢劫是被怎么遏制的?

小偷和抢劫是怎么被消灭的&#xff1f; 是被摄像头消灭的&#xff01; 一切土地和实物都会被安装传感设备监控 农业生产用地也会被物联检测 趣讲大白话&#xff1a;万物互联时代稳步实现 *********** 全国有5000万亩茶园 20年内一定会被物联网化 进入精耕农业时代 20年后&…