第11章 Qt 5事件处理及实例

合集下载

Qt入门教程 详细讲解版

Qt入门教程 详细讲解版

如何学习Qt我们假设你已经熟悉C++了!请先阅读一下Qt白皮书。

它包含一个关于Qt软件的概述,并且提供了一些用来示范使用Qt进行编程的代码的片断。

它会给你一个“大的图画”。

如果你想要完全的在C++中进行编程,不使用任何设计工具的帮助下在代码中设计你的界面,请阅读教程。

教程1就是被设计成把你带入Qt编程的一个教程,它更强调的是编写代码而不是一个特征的漫游。

教程2是一个更加真实的例子,示范了如何编写菜单、工具条、文件的载入和保存、对话框等地那个。

如果你想使用一个设计工具来设计你的用户界面,那么你至少要先阅读Qt设计器手册的前几章。

在这之后,学习一下上面提到的纯粹的C++教程(教程1和教程2)还是很值得的。

到现在为止,如果你已经完成了一些小的可以工作的应用程序并且对Qt编程有了一个主要的了解。

你可以直接开始你自己的项目了,但我们建议你阅读一些关键的概述来加深你对Qt的理解:对象模型和信号和槽。

在这里我们建议你看一下概述并且阅读一些和你的项目相关的文章。

你也许会发现浏览和你项目做相同事情的实例的源代码是非常有用的。

你也可以阅读Qt的源代码,因为它们也被提供。

如果你运行demo这个应用程序(在$QTDIR/examples/demo),你就会看到很多运转中的Qt窗口部件Qt提供了广泛的文档,完全前后参考的超文本,所以你可以很容易地按你喜欢的方式进行点击。

在文档中,你最经常使用的部分可能就是API参考。

每一个链接都提供了一个不同的方式来导航API参考,全都试试,看哪一个更适合你。

你现在应该已经准备好你的伟大工程:祝你好运,玩得开心!Qt教程一——共十四步这个教程介绍了使用Qt工具包进行图形用户界面编程。

它没有包括所有的东西:强调的是教授一种图形用户界面编程的编程思想,并且介绍Qt的特征也是必需的。

一些通常情况下使用的特征在这个教程里没有用到。

第一章开始讲述一个十行的Hello World程序并且后来的每一章都介绍了一个或几个更多的概念。

python pyqt5例子

python pyqt5例子

python pyqt5例子当涉及Python和PyQt5时,有许多不同的示例可以提供。

PyQt5是一个用于创建图形用户界面的工具包,它结合了Qt库和Python语言。

下面是一个简单的PyQt5示例,演示了如何创建一个简单的窗口应用程序:python.import sys.from PyQt5.QtWidgets import QApplication, QWidget.if __name__ == '__main__':app = QApplication(sys.argv)。

# 创建一个窗口。

window = QWidget()。

window.setWindowTitle('PyQt5示例')。

window.setGeometry(100, 100, 300, 200) # 设置窗口位置和大小。

window.show()。

sys.exit(app.exec_())。

在这个示例中,我们首先导入了必要的模块。

然后,在主程序中,我们创建了一个应用程序对象`QApplication`,并创建了一个窗口对象`QWidget`。

我们设置了窗口的标题和大小,并最后显示了窗口。

除了这个基本的示例之外,PyQt5还提供了许多其他功能,比如按钮、文本框、菜单等等。

你可以使用这些组件来创建更复杂的图形用户界面。

你还可以处理用户输入、响应事件等等。

希望这个简单的示例能够帮助你对PyQt5有一个初步的了解。

如果你需要更多的示例或者更深入的了解,可以查阅PyQt5的官方文档或者其他教程资源。

祝你编写PyQt5应用程序顺利!。

QT5开发及实例第1章

QT5开发及实例第1章

1.3.1 设计器Qt 5 Designer实现
在Input Widgets容器栏(如图1.14所示)中找到LineEdit文本控件,拖曳此 控件到中间的编辑框中,用于输入半径值;
1.3.1 设计器Qt 5 Designer实现
在Buttons容器栏(如图1.15所示)中找到PushButton按钮控件,拖曳此控件 到中间的编辑框中,用于提交响应单击事件。
1.1 什么是Qt
Qt支持的平台有: MS/Windows—95、98、NT 4.0、ME、2000、XP和Vista; UNIX/X11—Linux、Sun Solaris、HP-UX、Compaq Tru64 UNIX、IBM AIX、 SGI IRIX和其他很多X11平台;
Macintosh—Mac OS X;
Embedded—有帧缓冲(framebuffer)支持的Linux平台、Windows CE; Symbian/S60—目前已经可以提供技术预览版本。
1.2 Qt 5的安装
1.2.1 下载Qt 5 Crea.1所示。
1.3.2 代码实现
(3)在dialog.cpp 中添加如下代码: Dialog::Dialog(QWidget *parent) : QDialog(parent) { label1=new QLabel(this); label1->setText(tr("请输入圆的半径:")); lineEdit=new QLineEdit(this); label2=new QLabel(this); button=new QPushButton(this); button->setText(tr("显示对应圆的面积")); QGridLayout *mainLayout=new QGridLayout(this); mainLayout->addWidget(label1,0,0); mainLayout->addWidget(lineEdit,0,1); mainLayout->addWidget(label2,1,0); mainLayout->addWidget(button,1,1); }

Qt5开发及实例(第2版)-第5章Qt

Qt5开发及实例(第2版)-第5章Qt
主窗体qt5主窗体构成5152535455qt5文件操作功能qt5图像坐标变换qt5文本编辑功能qt5排版功能511基本元素qmainwindow是一个为用户提供主窗口程序的类包含一个菜单栏menubar多个工具栏toolbars多个锚接部件dockwidgets一个状态栏statusbar及一个中心部件centralwidget是许多应用程序的基础如文本编辑器图片编辑器等
void ImgProcessor::ShowOpenFile() { fileName =QFileDialog::getOpenFileName(this); if(!fileName.isEmpty()) { if(showWidget->text->document()->isEmpty()) { loadFile(fileName); } else { ImgProcessor *newImgProcessor =new ImgProcessor; newImgProcessor->show(); newImgProcessor->loadFile(fileName); } } }
5.1.3 菜单与工具栏的实现
将程序中用到的图片保存到该工程下的debug文件夹中,运行程序,结果如 图5.3所示。
5.2 Qt 5文件操作功能
5.2.1 新建文件
下面将介绍如何实现新建一个空白文件的功能。 (1)打开“imgprocessor.h”头文件,添“protected slots:”变量: protected slots: void ShowNewFile(); (2)在createActions()函数的“"新建"动作”最后添加事件关联: connect(NewFileAction,SIGNAL(triggered()),this,SLOT(ShowNewFile())); (3)实现新建文件功能的函数ShowNewFile()如下: void ImgProcessor::ShowNewFile() { ImgProcessor *newImgProcessor =new ImgProcessor; newImgProcessor->show(); }

新版qt5 信号和槽的写法

新版qt5 信号和槽的写法

新版qt5 信号和槽的写法新版Qt5 信号和槽的写法引言:Qt是一个功能强大的C++跨平台应用程序开发框架。

信号和槽是Qt框架的核心机制之一,是实现组件之间通信和交互的重要方式。

Qt5引入了一些更新后的语法和特性,使得信号和槽的写法更加简洁和灵活。

本文将一步一步地回答关于新版Qt5的信号和槽写法的问题。

一、什么是信号和槽?信号和槽是Qt框架中的一个设计模式,用于实现对象之间的通信和交互。

信号可以看作是某个事件发生时的通知,而槽则是接收到信号后具体执行的操作。

信号和槽之间通过连接来关联,使得当发生某个特定事件时,信号会自动触发并执行关联的槽中的操作。

二、新版Qt5的信号和槽写法变化有哪些?1.使用新的语法关键字`Q_OBJECT`:在Qt5中,需要在自定义的类中添加`Q_OBJECT`宏来声明该类支持信号和槽机制。

这样,在运行时,Qt的元对象系统会自动生成信号和槽相关的代码。

2.使用新的信号和槽关键字`signals`和`slots`:在Qt5之前的版本中,信号和槽通过关键字`SIGNAL()`和`SLOT()`进行声明和连接。

而在新版Qt5中,我们可以直接使用`signals`和`slots`关键字来声明和连接信号和槽。

3.不再需要使用`SIGNAL()`和`SLOT()`宏:在Qt5之前的版本中,我们需要使用`SIGNAL()`和`SLOT()`宏将函数名转换为字符串,从而进行信号和槽的连接。

而在新版Qt5中,这个宏是可选的,我们可以直接使用函数名来进行连接操作。

三、新版Qt5的信号和槽写法示例下面以一个简单的登录窗口为例来介绍新版Qt5的信号和槽写法。

首先,我们需要在类的声明中添加`Q_OBJECT`宏来声明该类支持信号和槽机制。

同时,我们需要包含`QObject`和`QWidget`头文件,因为我们将使用QObject和QWidget作为基类来创建我们的自定义类LoginWindow。

cpp#include <QObject>#include <QWidget>class LoginWindow : public QWidget{Q_OBJECTpublic:LoginWindow(QWidget *parent = nullptr);signals:void loginSuccess();private slots:void onLoginButtonClicked();};在类的定义中,我们声明了一个`loginSuccess`信号和一个`onLoginButtonClicked`槽函数。

pyqt5 python 案例

pyqt5 python 案例

pyqt5 python 案例1. PyQt5入门案例:创建一个简单的窗口在PyQt5中,可以使用QWidget类创建一个简单的窗口。

以下是一个简单的示例代码,可以创建一个空白的窗口。

```pythonimport sysfrom PyQt5.QtWidgets import QApplication, QWidgetif __name__ == '__main__':app = QApplication(sys.argv)window = QWidget()window.setWindowTitle('简单窗口')window.setGeometry(100, 100, 300, 200)window.show()sys.exit(app.exec_())```2. PyQt5案例:添加按钮和标签在PyQt5中,可以使用QPushButton和QLabel类来创建按钮和标签。

以下是一个示例代码,创建一个窗口,其中包含一个按钮和一个标签。

```pythonimport sysfrom PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLabeldef button_clicked():label.setText('按钮被点击了!')if __name__ == '__main__':app = QApplication(sys.argv)window = QWidget()window.setWindowTitle('按钮和标签')window.setGeometry(100, 100, 300, 200)button = QPushButton('点击我', window)button.setGeometry(100, 50, 100, 30)button.clicked.connect(button_clicked)label = QLabel('标签', window)label.setGeometry(100, 100, 100, 30)window.show()sys.exit(app.exec_())```3. PyQt5案例:创建一个简单的登录窗口在PyQt5中,可以使用QLineEdit、QPushButton和QMessageBox类来创建一个简单的登录窗口。

QT中事件处理器和事件过滤器实现实例

QT中事件处理器和事件过滤器实现实例

QT中事件处理器和事件过滤器实现实例Qt中事件处理的⽅式,最常⽤的就是使⽤事件处理器(event handler)和事件过滤器(event filter)这两种⽅法。

接下来,我们就来看看事件处理器和事件过滤器是怎么使⽤的。

事件处理器Qt中针对每⼀种常见的事件类型都提供了相应的事件处理器,我们如果想捕获某种类型的事件并进⾏⾃定义处理,那么只需要实现重写这些事件处理器就⾏。

常见的事件类型和对应的事件处理器如下图所⽰:⽤户⾃定义事件定义如下:在⽇常使⽤中,我们最常使⽤的⿏标事件:新建⼀个基于QWidget的应⽤程序,在QWidget的头⽂件中找到⿏标操作事件处理器虚函数如下:我们将其在我们的QWidget⼦类中重写实现:到这⾥这个功能就实现了,⼤家看看上⾯的头⽂件就知道这⾥还实现了其它类型事件的处理,其实都是⼀样的思路,找到欲处理的事件类型,找到对应的事件处理器,重写事件处理器中处理事件的⽅法即可。

这个看起来⽐较简单!事件过滤器Qt事件模型中⼀项⾮常强⼤的功能就是⼀个QObject实例可以监视另⼀个QObject实例中的事件,实现⽅法是在⽬标对象中安装事件过滤器。

假设我们有⼀个Dialog控件,由⼀些QLineEdit控件组成。

我们希望使⽤Space键得到下⼀个QLineEdit的输⼊焦点。

⼀个最直接的⽅法是继承QLineEdit重写keyPressEvent()函数,当点击了Space键时,调⽤focusNextChild():C++ Code1 2 3 4 5 6 7 8 9 10 11void MyLineEdit::keyPressEvent(QKeyEvent *event) {if (event->key() == Qt::Key_Space){focusNextChild();}else{QLineEdit::keyPressEvent(event);}}这个⽅法有⼀个最⼤的缺点:如果我们在窗体中使⽤了很多不同类型的控件(QComboBox,QSpinBox等等),我们也要继承这些控件,重写它们的keyPressEvent()。

qt的6个简单小案例

qt的6个简单小案例

qt的6个简单小案例以下是6个简单的Qt案例:1. 窗口应用程序:创建一个简单的窗口应用程序,显示一个标签和一个按钮。

```cpp#include <QApplication>#include <QLabel>#include <QPushButton>int main(int argc, char *argv[]){QApplication app(argc, argv);QLabel label("Hello Qt!");QPushButton button("Click me!");label.show();button.show();return app.exec();}```2. 对话框应用程序:创建一个对话框应用程序,显示一个输入框和一个按钮,并在按钮点击时弹出一个消息框。

```cpp#include <QApplication>#include <QLineEdit>#include <QPushButton>#include <QMessageBox>int main(int argc, char *argv[]){QApplication app(argc, argv);QLineEdit input;QPushButton button("Submit");QObject::connect(&button, &QPushButton::clicked, [&]() {QMessageBox::information(nullptr, "Message", "Input: " + input.text());});input.show();button.show();return app.exec();}3. 列表视图应用程序:创建一个列表视图应用程序,显示一个列表,并在选中项改变时弹出一个消息框。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
③ 鼠标右击资源文件,选择“Add Prefix...”菜单项,在弹出的对话框的 “Prefix”栏中填写“/new/prefix1”,单击“OK”按钮,此时项目目录树资源 文件下新增“/new/prefix1”目录项,右击该项,选择“添加现有文件...”菜单 项,按照如图11.6所示的步骤操作,在弹出的对话框中选择“image/image.png” 文件,单击“打开”按钮。
mouseDoubleClickEvent()函数为鼠标双击事件响应函数,此处没有实现具 体功能,但仍要写出函数体框架: void MouseEvent::mouseDoubleClickEvent(QMouseEvent *e){} (3)运行程序,效果如图11.1所示。
11.2 键盘事件及实例
mouseReleaseEvent()函数为鼠标松开事件响应函数,其具体代码如下:
void MouseEvent::mouseReleaseEvent(QMouseEvent *e) { QString str="("+QString::number(e->x())+","+QString::number(e->y()) +")"; statusBar()->showMessage(tr("释放在:")+str,3000); }
//按照步进值的间隔绘制横向的网格线
//(b)
11.2 键盘事件及实例
keyPressEvent()函数处理键盘的按下事件,具体代码。 界面重画函数paintEvent(),将pix绘制在界面上。其具体代码如下: void KeyEvent::paintEvent(QPaintEvent *) { QPainter painter; painter.begin(this); painter.drawPixmap(QPoint(0,0),*pix); painter.end(); } (5)运行结果如图11.2所示。
//设置窗体的标题 //(a) //(b) //(c) PressEvent()函数为鼠标按下事件响应函数,QMouseEvent类的 button()方法可以获得发生鼠标事件的按键属性(左键、右键、中键等)。具体 代码如下:
void MouseEvent::mousePressEvent(QMouseEvent *e) { QString str="("+QString::number(e->x())+","+QString::number(e->y()) +")"; //(a) if(e->button()==Qt::LeftButton) { statusBar()->showMessage(tr("左键:")+str); } else if(e->button()==Qt::RightButton) { statusBar()->showMessage(tr("右键:")+str); } else if(e->button()==Qt::MidButton) { statusBar()->showMessage(tr("中键:")+str); } }
第11章 Qt 5事件处理及实例
11.1 11.2 11.3 鼠标事件及实例 键盘事件及实例 事件过滤及实例
11.1 鼠标事件及实例
【例】(简单) 本例将介绍如何获得和处理鼠标事件。程序最终演示效果如 图11.1所示。
11.1 鼠标事件及实例
(1)在头文件“mouseevent.h”中,重定义了QWidget类的三个鼠标事件方 法,即mouseMoveEvent、mousePressEvent和mouseReleaseEvent。当有鼠标事件 发生时,就会响应相应的函数,其具体内容如下:
具体实现步骤如下。 (1)头文件“eventfilter.h”中声明了所需的各种控件及槽函数,其具体代码 如下:
#include <QDialog> #include <QLabel> #include <QImage> #include <QEvent> class EventFilter : public QDialog { Q_OBJECT public: EventFilter(QWidget *parent = 0,Qt::WindowFlags f=0); ~EventFilter(); public slots: bool eventFilter(QObject *, QEvent *); private: QLabel *label1; QLabel *label2; QLabel *label3; QLabel *stateLabel; QImage Image1; QImage Image2; QImage Image3; };
11.3 事件过滤及实例
例如,Qt已经提供了QPushButton用于表示一个普通的按钮类。如果需要实现 一个动态的图片按钮,即当鼠标按下时按钮图片发生变化,则需要同时响应鼠标 的按下等事件。 【例】(难度一般) 这里通过一个实例介绍如何通过事件过滤器实现动态图 片按钮效果,如图11.7所示。
11.3 事件过滤及实例
11.2 键盘事件及实例
② 在弹出的对话框中选择资源要存放的路径,如图11.4所示,在“名称”栏 中填写资源名称“keyevent”。
11.2 键盘事件及实例
单击“下一步”按钮,单击“完成”按钮。此时,项目下自动添加了一个 “keyevent.qrc”资源文件,如图11.5所示。
11.2 键盘事件及实例
11.2 键盘事件及实例
(4)drawPix()函数实现了在QPixmap对象上绘制图像,其具体代码如下:
void KeyEvent::drawPix() { pix->fill(Qt::white); QPainter *painter = new QPainter; QPen pen(Qt::DotLine); for(int i=step;i<width;i=i+step) { painter->begin(pix); painter->setPen(pen); painter->drawLine(QPoint(i,0),QPoint(i,height)); painter->end(); } for(int j=step;j<height;j=j+step) { painter->begin(pix); painter->setPen(pen); painter->drawLine(QPoint(0,j),QPoint(width,j)); painter->end(); } painter->begin(pix); painter->drawImage(QPoint(startX,startY),image); painter->end(); } //重新刷新pix对象为白色底色 //创建一个QPainter对象 //(a) //按照步进值的间隔绘制纵向的网格线 //指定pix为绘图设备
11.2 键盘事件及实例
(3)在当前目录下新建一个文件夹命名为image,并在文件夹内保存一个名 为“image.png”的图片;在项目中按照以下步骤添加资源文件。 ① 在项目名“KeyEvent”上单击鼠标右键→“添加新文件…”菜单项,从如 图11.3所示的对话框单击“Qt”(模板)→“Qt Resource File”→“Choose...”按 钮。
11.1 鼠标事件及实例
mouseMoveEvent()函数为鼠标移动事件响应函数,QMouseEvent类的x()和 y()方法可以获得鼠标的相对位置,即相对于应用程序的位置。具体代码如下:
void MouseEvent::mouseMoveEvent(QMouseEvent *e) { MousePosLabel->setText("("+QString::number(e->x())+", "+QString::number(e->y())+")"); }
【例】(难度一般) 下面通过实现键盘控制图标的移动来介绍键盘事件的应 用,如图11.2所示。
11.2 键盘事件及实例
具体实现步骤如下。 (1)头文件“keyevent.h”的具体内容如下:
#include <QWidget> #include <QKeyEvent> #include <QPaintEvent> class KeyEvent : public QWidget { Q_OBJECT public: KeyEvent(QWidget *parent = 0); ~KeyEvent(); void drawPix(); void keyPressEvent(QKeyEvent *); void paintEvent(QPaintEvent *); private: QPixmap *pix; QImage image; /* 图标的左上顶点位置 */ int startX; int startY; /* 界面的宽度和高度 */ int width; int height; int step; };
//作为一个绘图设备,使用双缓冲机制实现图形的绘制 //界面中间的小图标
//网格的大小,即移动的步进值
11.2 键盘事件及实例
(2)源文件“keyevent.cpp”的具体代码如下:
#include "keyevent.h" #include <QPainter> KeyEvent::KeyEvent(QWidget *parent) : QWidget(parent) { setWindowTitle(tr("键盘事件")); setAutoFillBackground(true); QPalette palette = this->palette(); palette.setColor(QPalette::Window,Qt::white); setPalette(palette); setMinimumSize(512,256); setMaximumSize(512,256); width=size().width(); height=size().height(); pix = new QPixmap(width,height); pix->fill(Qt::white); image.load("../image/image.png"); startX=100; startY=100; step=20; drawPix(); resize(512,256); }
相关文档
最新文档