C++ GUI Qt4学习笔记07
事件(event)是由串口系统或者Qt自身产生的,用以响应所发生的各类事情。当用户按下或者松开键盘或者鼠标上的按键时,就可以产生一个键盘或者鼠标事件;当某个窗口第一次显示的时候,就会产生一个绘制事件。用来告知窗口需要重绘制它本身,从而使得该窗口可见。
使用Qt进行编程开发时,基本不需要考虑事件,Qt窗口部件都会发射信号。但是当我们需要编写自己的自定义窗口部件,或者是当我们希望改变已经存在的Qt窗口部件的行为时,事件就变得非常有用了。
事件和信号是两个概念。在使用窗口部件时,信号是十分有用的,而在实现窗口部件时,事件则是十分有用的。
7.1重新实现事件处理器
在Qt中,事件就是QEvent子类的一个实例。
7.2安装事件过滤器
Qt事件模型一个非常强大的功能是:QObject实例在看到它自己的事件之前,可以通过设置另外一个QObject实例先监视这个事件。
7.3处理密集时的相应保持
当调用QApplication:exec()时,就启动了Qt的事件循环。在开始时,Qt会发出一些事件命令来显示和绘制窗口部件。在这之后,事件循环就开始运行,它不断检查是否有事件发生并且把这个事件发送给应用程序的QObject。
定时器事件,定时器事件允许应用程序可以再一定的时间间隔后执行事件处理。定时器事件可以用来实现光标的闪烁和其他动画的播放,或者只简单地用作显示的刷新。
Ticker窗口部件实例:显示了一串文本标语,每30毫秒向左移动一个像素,如果窗口部件比文本宽,那么文本将会被多次重复,直到能够填满整个窗口部件的宽度为止。
源码如下:
ticker.h
- #ifndef TICKER_H
- #define TICKER_H
- #include <QWidget>
- class Ticker : public QWidget
- {
- Q_OBJECT
- Q_PROPERTY(QString text READ text WRITE setText)
- public:
- Ticker(QWidget *parent = 0); //析构
- void setText(const QString &newText); //设置要显示的文本
- QString text() const { return myText; }
- QSize sizeHint() const;
- protected:
- void paintEvent(QPaintEvent *event);
- void timerEvent(QTimerEvent *event);
- void showEvent(QShowEvent *event);
- void hideEvent(QHideEvent *event);
- private:
- QString myText;
- int offset;
- int myTimerId;
- };
- #endif
ticker.cpp
- #include <QtGui>
- #include "ticker.h"
- Ticker::Ticker(QWidget *parent)
- : QWidget(parent)
- {
- offset = 0;
- myTimerId = 0;
- }
- void Ticker::setText(const QString &newText) //设置要显示的文本
- {
- myText = newText;
- update(); //强制执行一个重绘操作
- updateGeometry(); //通知对Ticker窗口部件负责的任意布局管理器,提示该窗口部件的大小发生了变化。
- }
- QSize Ticker::sizeHint() const //返回文本所需的空间大小,并以此作为窗口部件的理想尺寸。
- {
- return fontMetrics().size(0, text()); //返回一个QFontMetrics对象,可以用这个对象查询并获得与这个窗口部件字体相关的信息
- }
- void Ticker::paintEvent(QPaintEvent * /* event */) //使用QPainter::drawText()绘制文本
- {
- QPainter painter(this);
- int textWidth = fontMetrics().width(text()); //使用fontMetrics()确定文本在水平方向上所需的空间
- if (textWidth < 1)
- return;
- int x = -offset;
- while (x < width()) { //考虑offset的值,多次绘制文本,填充整个窗口部件的宽度为止
- painter.drawText(x, 0, textWidth, height(),
- Qt::AlignLeft | Qt::AlignVCenter, text());
- x += textWidth;
- }
- }
- void Ticker::showEvent(QShowEvent * /* event */) //启动定时器
- {
- myTimerId = startTimer(30);
- }
- void Ticker::timerEvent(QTimerEvent *event)
- {
- if (event->timerId() == myTimerId) {
- ++offset;
- if (offset >= fontMetrics().width(text()))
- offset = 0;
- scroll(-1, 0); //把窗口部件的内容向左滚动一个像素
- } else {
- QWidget::timerEvent(event);
- }
- }
- void Ticker::hideEvent(QHideEvent * /* event */)
- {
- killTimer(myTimerId); 停止定时器
- myTimerId = 0;
- }
C++ GUI Qt4学习笔记07的更多相关文章
- C++ GUI Qt4学习笔记01
C++ GUI Qt4学习笔记01 qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概 ...
- C++ GUI Qt4学习笔记03
C++ GUI Qt4学习笔记03 qtc++spreadsheet文档工具resources 本章介绍创建Spreadsheet应用程序的主窗口 1.子类化QMainWindow 通过子类化QM ...
- C++ GUI Qt4学习笔记08
C++ GUI Qt4学习笔记08 qtc++signal图形引擎文档 本章介绍Qt的二维图形引擎,Qt的二维图形引擎是基于QPainter类的.<span style="colo ...
- C++ GUI Qt4学习笔记09
C++ GUI Qt4学习笔记09 qtc++ 本章介绍Qt中的拖放 拖放是一个应用程序内或者多个应用程序之间传递信息的一种直观的现代操作方式.除了剪贴板提供支持外,通常它还提供数据移动和复制的功 ...
- C++ GUI Qt4学习笔记05
C++ GUI Qt4学习笔记05 qtc++正则表达式 QIntValidator -- 只让用户输入整数 QDoubleValidator -- 只让用户输入浮 ...
- 【QT】C++ GUI Qt4 学习笔记1
Find对话框实现 平台 Qt5.3.2 MinGW4.8.2 注意创建时用QDialog finddialog.h #ifndef FINDDIALOG_H #define FINDDIALOG_H ...
- 【QT】C++ GUI Qt4 学习笔记2
Go To Cell 利用QT Desinger做好界面后加入的代码有 gotocelldialog.h #ifndef GOTOCELLDIALOG_H #define GOTOCELLDIALOG ...
- 【QT】C++ GUI Qt4 学习笔记3
菜单界面的实现. 看书上第三章,好长,好多代码.我敲了半天,想看看效果,结果却显示不出来.仔细一看,发现spreadsheet的实现在第四章.郁闷.... 又到官网上下代码,结果居然不能运行.难道是因 ...
- 【QT】C++ GUI Qt4 学习笔记4
感觉这本书的顺序设计的太不合理了,出现的最多的一句话就是后面会讲.按照使用的顺序讲不行吗?搞得代码都运行不了. 我决定先直接跳到73页,子类化QTableWidgetItem这一节.因为前面功能的实现 ...
随机推荐
- 【c++进阶:c++ 顺序容器vector,string,deque,list,forward_list,array常用性质】
常用5种顺序容器性质: https://blog.csdn.net/oil_you/article/details/82821833 关于deque https://www.cnblogs.com/L ...
- ES6中变量的解构赋值
1.数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 输出: 上面代码表示,可以从数组中提取值,按照对应位置,对变 ...
- Jmeter之线程组(Stepping和Ultimate)
jmeter自带的线程组比较简单,如果需要逐渐增加并发数的功能并不能实现,所以就需要使用Jmeter插件--Stepping Thread Group. 一.安装Stepping/UItimate T ...
- Ajax请求Json数据,报500错误,后台没有错误日志。
post请求:http://localhost:9080/DataDiscoveryWeb/issueformcount/queryIssueTendencyDetail.xhtml?jobId=86 ...
- Python学习之==>日志模块
一.logging模块介绍 logging是Python中自带的标准模块,是Python中用来操作日志的模块. 1.控制台输出日志 import logging logging.basicConfig ...
- 图解 SQL 里的各种 JOIN
约定 下文将使用两个数据库表 Table_A 和 Table_B 来进行示例讲解,其结构与数据分别如下: mysql> SELECT * FROM Table_A ORDER BY PK ASC ...
- vue-devtools安装以后,勾选了“允许访问文件网址”之后还是无法使用
勾选了“允许访问文件网址”,还是无法使用: Vue.js is detected on this page. Devtools inspection is not available because ...
- linux服务器上安装mysql
mysql版本:mysql-5.6.44-linux-glibc2.12-x86_64.tar linux操作系统和版本信息: 1.检查linux服务器上是否已安全mysql [root@localh ...
- CentOS7 源进源出
echo 200 ct >> /etc/iproute2/rt_tablesecho 201 cu >> /etc/iproute2/rt_tables ip route ad ...
- Widget代码讲解
参考:https://zhuanlan.zhihu.com/p/28225011 QT版本为5.12.4 1.main.cpp #include "widget.h" #inclu ...