Day13 qt 高级控件,自定义控件,事件,绘图,定时器

高级控件

QListWidget
        列表展示控件
效果
添加数据
ui->listWidget->addItem("A");
QStringList list;
list << "B" << "C" << "D";
ui->listWidget->addItems(list);
设置item点击
void Widget::on_listWidget_itemClicked(QListWidgetItem *item)
{
//获取item中的内容
qDebug() << item->text() << endl;
//获取选中的item在qlistwidget中的位置
qDebug() << ui->listWidget->currentRow() << endl;
}
QTreeWidget
//添加数据
//创建一级item
QStringList list;
list << "测试";
QTreeWidgetItem *item = new QTreeWidgetItem(list,0);
//创建二级item
QStringList list2;
list2 << "翠花" << "女" << "22";
QTreeWidgetItem *sonItem = new QTreeWidgetItem(list2,0);
//将二级item添加到一级item中
item->addChild(sonItem);
//将一级item添加到控件中
ui->treeWidget->addTopLevelItem(item);
//item点击事件
void Widget::on_treeWidget_itemClicked(QTreeWidgetItem *item, int
column)
{
qDebug() << item->text(column) << endl;
}
QTableWidget
for(int i = 0; i < 10; i++)
{
QString name = "张三";
//QString::number(i)数字转字符串
name.append(QString::number(i));
//新建行
int row = ui->tableWidget->rowCount();
//插入行
ui->tableWidget->insertRow(row);
//创建item
QTableWidgetItem *itemName = new QTableWidgetItem(name);
//给row行的第0个位置设置为itemName
ui->tableWidget->setItem(row,0,itemName);
QTableWidgetItem *itemSex = new QTableWidgetItem("男");
ui->tableWidget->setItem(row,1,itemSex);
QTableWidgetItem *itemAge = new QTableWidgetItem("18");
ui->tableWidget->setItem(row,2,itemAge);
QTableWidgetItem *itemAddress = new QTableWidgetItem("北方");
ui->tableWidget->setItem(row,3,itemAddress);
}
点击事件
void Widget::on_tableWidget_cellClicked(int row, int column)
{
qDebug() << "row:" << row << endl;
qDebug() << "column:" << column << endl;
qDebug() << "text:" << ui->tableWidget->item(row,column)->text() <<
endl;
}
QtoolBox
直接将内容拖拽到里面即可
QTabWidget
直接将内容拖拽到里面即可
QStackWidget
直接将内容拖拽到里面即可
void Widget::on_btn01_clicked()
{
ui->stackedWidget->setCurrentIndex(0);
}
void Widget::on_btn02_clicked()
{
ui->stackedWidget->setCurrentIndex(1);
}
void Widget::on_btn03_clicked()
{
ui->stackedWidget->setCurrentIndex(2);
}

自定义控件

目的
将多个控件或窗口作为一个整体 , 使其可以多次复用
步骤
1, 创建一个设计师界面类
2, 在该类中编写需要提出的自定义组件样式与代码 , 如下
代码 : 头文件 form.h
#ifndef FORM_H
#define FORM_H
#include <QWidget>
#include <QSpinBox>
#include <QHBoxLayout>
#include <QString>
namespace Ui {
class Form;
}
class Form : public QWidget
{
Q_OBJECT
public:
explicit Form(QWidget *parent = 0);
~Form();
void setValue(int num);
int getValue();
private:
Ui::Form *ui;
};
#endif // FORM_H
代码 : 源文件 form.cpp
#include "form.h"
#include "ui_form.h"
Form::Form(QWidget *parent) :
QWidget(parent),
ui(new Ui::Form)
{
ui->setupUi(this);
connect(ui->spinBox,SIGNAL(valueChanged(int)),
ui->horizontalSlider,SLOT(setValue(int)));
connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),
ui->spinBox,SLOT(setValue(int)));
}
Form::~Form()
{
delete ui;
}
void Form::setValue(int num)
{
if(num < 0 || num > 99)
{
throw 0;
}
ui->spinBox->setValue(num);
}
int Form::getValue()
{
return ui->spinBox->value();
}
3, 在使用该自定义控件的界面中添加一个 QWidget, 用于容纳该自定义组件 , 并点击右键
提升为
输入步骤 1 中自定义的类名称
点击添加
点击提升
widget 窗口
代码头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_pushButton_clicked();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
代码源文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
ui->widget->setValue(50);
}

事件

概述

Qt 中所有事件类都继承于 QEvent
event() 函数并不直接处理事件,而是按照事件对象的类型分派给特定的事件处理函
数。
示例:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QMouseEvent>
#include <QDebug>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
virtual void mouseMoveEvent(QMouseEvent *event);
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
qDebug() << "鼠标移动:\tx=" << event->x() << "\ty=" << event->y() <<
endl;
}
void Widget::mousePressEvent(QMouseEvent *event)
{
qDebug() << "鼠标按下" << endl;
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
qDebug() << "鼠标抬起" << endl;
}
事件分发器
概述
事件对象创建完毕后, Qt 将这个事件对象传递给 QObject event() 函数。
event() 函数并不直接处理事件 , 而是将这些事件对象按照它们不同的类型 , 分发给不同
的事件处理器 (eventhandler)
如上所述, event() 函数主要用于事件的分发。如果你希望在事件分发之前做一些操作 ,
就可以重写这个 event() 函数
对应函数
virtual bool event(QEvent *e)
注意 :
如果传入的事件已被识别并且处理,则需要返回 true ,否则返回 false 。如果返回值是 true ,那么 Qt 会认为这个事件已经处理完毕,不会再将这。个事件发送给其它对象,而是会继续处理事件队列中的下一事件
事件过滤器
概述
步骤
this->installEventFilter(this);
2, 重写事件过滤器函数
bool MyLabel::eventFilter(QObject *watched, QEvent *event)
{
//判断哪个控件触发了
if(watched == this)//当前控件
{
//判断具体事件
if(event->type() == QEvent::MouseButtonPress)
{
QMouseEvent *ev = (QMouseEvent *)event;
qDebug()<<事件过滤器中 鼠标按下了x=<<ev->x()<<, y=<<ev->y()
<<endl;
return true;
}
}
return QLabel::eventFilter(watched, event);
}

绘图

概述

整个绘图系统基于 QPainter QPainterDevice QPaintEngine 三个类。
绘制窗口图形时在绘图事件中
绘图事件: virtual void paintEvent(QPaintEvent *event)
绘图事件触发时机:
1, 窗口加载
2, 调用 update()
示例 : 页面背景绘制
void Widget::paintEvent(QPaintEvent *ev)
{
// 创建画家
QPainter *painter = new QPainter(this);
// 定义绘图设备
QPixmap pix;
// 加载图片
pix.load(":/image/Sunny.jpg");
// 设置大小
pix.scaled(this->width(),this->height());
// 绘制
painter->drawPixmap(0,0,this->width(),this->height(),pix);
}

定时器

分类
定时器事件
定时器对象
延迟执行
定时器事件
步骤:
1, 在头文件中声明 int 型变量用于记录定时器 id
2, 在头文件中声明定时器事件函数
3, 在源文件中开启定时器
4, 重写定时器事件函数
相关函数:
开启定时器
int startTimer(int interval, Qt::TimerType timerType =
Qt::CoarseTimer)
停止定时器
void killTimer(int id);
定时器事件函数
virtual void timerEvent(QTimerEvent *e)
示例 1:10 秒倒计时
// 在头文件中定义定时器 id 与要重写的定时器函数
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget ;
}
class Widget : public QWidget
{
Q_OBJECT
public :
explicit Widget ( QWidget * parent = 0 );
~Widget ();
virtual void timerEvent ( QTimerEvent * e );
private :
Ui::Widget * ui ;
int id ;
};
#endif // WIDGET_H
// 在源文件中实现
#include "widget.h"
#include "ui_widget.h"
#include <QString>
Widget::Widget ( QWidget * parent ) :
QWidget ( parent ),
ui ( new Ui::Widget )
{
ui -> setupUi ( this );
connect ( ui -> btn_start , & QPushButton::clicked ,[ this ](){
id = startTimer ( 1000 );
});
connect ( ui -> btn_stop , & QPushButton::clicked ,[ this ](){
killTimer ( id );
});
}
Widget::~Widget ()
{
delete ui ;
}
void Widget::timerEvent ( QTimerEvent * e )
{
static int num = 10 ;
num -- ;
ui -> text_num -> setText ( QString::number ( num ));
}
定时器对象
1, 在头文件中声明定时器对象
2, 在源文件中创建定时器对象
3, 设置定时器的信号与槽
4, 在适当位置启动或停止定时器
相关函数与信号
函数
QTimer(QObject *parent = Q_NULLPTR);
void start(int msec);
参数 : 延迟时间
void start();
void stop();
信号
void timeout(QPrivateSignal);
示例:
//头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QTimer>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_btn_start_clicked();
void on_btn_stop_clicked();
private:
Ui::Widget *ui;
QTimer *timer;
public slots:
void setTime();
};
#endif // WIDGET_H
//源文件
#include "widget.h"
#include "ui_widget.h"
#include <QString>
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
timer = new QTimer(this);
connect(timer,&QTimer::timeout,this,&Widget::setTime);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_btn_start_clicked()
{
timer->start(1000);
}
void Widget::on_btn_stop_clicked()
{
timer->stop();
}
void Widget::setTime()
{
static int time = 10;
time--;
ui->text_num->setText(QString::number(time));
}
延迟执行
注意 : 只会执行一次
头文件
        QTimer
相关函数
        void singleShot(int msec, Functor functor)
示例:
QTimer::singleShot(5000,[&](){
qDebug() << " 延迟执行 " << endl;
});

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

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

相关文章

【EI稳定检索】第三届绿色能源与电力系统国际学术会议(ICGEPS 2024)

第三届绿色能源与电力系统国际学术会议&#xff08;ICGEPS 2024&#xff09; 2024 3rd International Conference on Green Energy and Power Systems 绿色能源是指可以直接用于生产和生活的能源。它包括核能和“可再生能源”。随着世界各国能源需求的不断增长和环境保护意识…

uniapp小程序项目连接微信客服【最新/最全教程】

目录 文档微信官网文档图片微信小程序客服配置官网 效果图聊天地址手机微信电脑端 微信聊天功能实现微信小程序后台添加客服微信号以及配置代码实现参考最后 文档 微信官网文档 微信官网文档 图片 微信小程序客服配置官网 微信小程序客服配置官网 效果图 聊天地址 地址 手…

C++学习寄录(八.继承)

继承的语法&#xff1a;class 子类 : 继承方式 父类 class A : public B; A 类称为子类 或 派生类 B 类称为父类 或 基类 1.基本使用 未使用继承的代码比较冗余重复 #include <iostream> #include <fstream> #include <string> #include <chrono>…

Linux处理系统常见命令

目录 1 sudo 1.1 介绍 1.2 配合 2 ifconfig与ping 2.1 ifconfig 2.2 ping 3 kill 4 apt-get 4.1 介绍 4.2 配合 5 history 6 clear 7 env 1 sudo 1.1 介绍 给这条命令最高权限&#xff0c;比如 sudo cp something.txt /usr/bin/something.txt 1…

Visio学习笔记

1. 常用素材 1.1 立方体&#xff1a;张量, tensor 操作路径&#xff1a;更多形状 ⇒ 常规 ⇒ 基本形状 自动配色 在选择【填充】后Visio会自动进行配色&#xff1b;

【数据结构】——解决topk问题

前言&#xff1a;我们前面已经学习了小堆并且也实现了小堆&#xff0c;那么我们如果要从多个数据里选出最大的几个数据该怎么办呢&#xff0c;这节课我们就来解决这个问题。我们就用建小堆的方法来解决。 首先我们来看到这个方法的时间复杂度&#xff0c;我们先取前k个数据建立…

L1-004:计算摄氏温度

题目描述 给定一个华氏温度F&#xff0c;本题要求编写程序&#xff0c;计算对应的摄氏温度C。计算公式&#xff1a;C5(F−32)/9。题目保证输入与输出均在整型范围内。 输入格式&#xff1a;输入在一行中给出一个华氏温度。 输出格式&#xff1a;在一行中按照格式“Celsius C”…

接口中的大事务,该如何进行优化?

前言 作为后端开发的程序员&#xff0c;我们常常会的一些相对比较复杂的逻辑&#xff0c;比如我们需要给前端写一个调用的接口&#xff0c;这个接口需要进行相对比较复杂的业务逻辑操作&#xff0c;比如会进行&#xff0c;查询、远程接口或本地接口调用、更新、插入、计算等一…

解决msvcr71.dll丢失5个方法,修复程序运行缺失dll问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcr71.dll丢失”。这个错误提示通常出现在运行某些程序或游戏时&#xff0c;给使用者带来了很大的困扰。那么&#xff0c;究竟是什么原因导致了msvcr71.dll文件的丢失呢&#xff1f;本文…

什么是海外私人IP代理?是纯净独享的代理吗?

相信许多互联网工作者都遇到过IP禁令&#xff0c;比如网络抓取项目&#xff0c;使用共享代理服务器向网站发出第一个请求&#xff0c;但却您收到了禁令&#xff0c;这大部分是由于你的共享IP经过多人使用被禁用所致。 那么到底什么是私人代理呢&#xff1f;它们是否适合您的情…

微服务实战系列之Redis(cache)

前言 云淡天高&#xff0c;落木萧萧&#xff0c;一阵西北风掠过&#xff0c;似寒刀。冬天渐渐变得更名副其实了。“暖冬”的说法有点言过其实了。——碎碎念 微服务实战系列之Cache微服务实战系列之Nginx&#xff08;技巧篇&#xff09;微服务实战系列之Nginx微服务实战系列之F…

【VScode】代码文件注释,User snippets 配置 Python/C++ , 其他语言类似

在代码文件头部&#xff0c;输入 header &#xff0c;回车&#xff0c;自动生成文件注释 Python {"HEADER": {"prefix": "header","body": ["# -*- encoding: utf-8 -*-", "\"\"\"","Date …

OKCC 客户中心

OKCC服务了这么多家客户中心&#xff0c;但很多小伙伴们其实并不是太了解客户中心的主要功能&#xff0c;那么我今天将从两类客户中心介绍下他们的主要功能。 一、 运营机构客户中心的功能 对于运营机构而言&#xff0c;客户中心的功能包括:能够帮助运营机构提升品牌形象&…

set与map

set与map 一、序列式容器与关联式容器二、pair1、键值对2、作用3、构造函数4、make_pair&#xff08;1&#xff09;构造函数&#xff08;2&#xff09;作用 5、代码6、运行结果 三、set1、概念2、代码3、运行结果4、说明 四、multiset1、与set的关系2、代码3、运行结果 五、map…

Python异常处理:try语句的应用与技巧

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 异常处理在Python中是至关重要的。try-except是用于捕获和处理异常的核心机制之一。让我们深入了解如何使用try-except&#xff0c;处理各种异常情况。 try-except语句 在编程中&#xff0c;异常是指运行时发生…

Linux系统-----进程管理(进程的创建与控制)

目录 前言 进程 1.基本概念 2.特征 3.Linux系统的进程 进程的创建 1. fork()函数 2. 多进程的创建与输出 进程的控制 1. exec()系列 2. wait() 函数 3. execl( )和fork( )联合使用 4. exit&#xff08; &#xff09; 前言 前面我们学习了Linux系统的基本指令以及如…

振南技术干货集:各大平台串口调试软件大赏(1)

注解目录 &#xff08;串口的重要性不言而喻。为什么很多平台把串口称为 tty&#xff0c;比如 Linux、MacOS 等等&#xff0c;振南告诉你。&#xff09; 1、各平台上的串口调试软件 1.1Windows 1.1.1 STCISP &#xff08;感谢 STC 姚老板设计出 STCISP 这个软件。&#xf…

C语言进阶指南(16)(自定义数据类型——结构体)

欢迎来到博主的专栏——C语言进阶指南 博主id&#xff1a;reverie.ly 文章目录 结构体类型结构体类型的声明结构体变量的声明 结构体变量的初始化结构体变量结构体变量的赋值结构体变量的成员结构体变量的使用结构体变量的内存存储 前面使用的变量都是简单类型的变量&#xff0…

浅学指针(3)

系列文章目录 文章目录 系列文章目录前言系列文章目录前言1. 字符指针变量2. 数组指针变量那数组指针变量应该是&#xff1a;存放的应该是数组的地址&#xff0c;能够指向数组的指针变量。2.2 数组指针变量怎么初始化总结&#xff1a;函数名就是地址&#xff0c;&函数名和直…

Debian arm系统安装wxPython

一、系统版本 二、安装wxPython-4.0.4.tar.gz 1、下载依赖 >sudo apt update >sudo apt-get install build-essential libgtk-3-dev libwebkit2gtk-4.0-dev libssl-dev libcurl4-openssl-dev libgstreamer-plugins-base1.0-dev libnotify-dev freeglut3 freeglut3-dev …