没有合适的资源?快使用搜索试试~ 我知道了~
首页DZY整理:从入门到精通的Qt学习教程
DZY整理:从入门到精通的Qt学习教程
4星 · 超过85%的资源 需积分: 10 14 下载量 104 浏览量
更新于2024-07-21
收藏 3.67MB PDF 举报
"Qt学习资料"是一份全面的指南,旨在帮助初学者系统地掌握Qt编程。该资料从基础入门开始,首先介绍了Qt的基本概念和使用方法,通过实例演示了如何在Qt环境中实现"Hello, World!"程序。随后章节深入探讨了信号槽机制,这是Qt的核心特性之一,它允许组件间进行通信和数据交换。 接下来的内容涵盖了组件布局,如如何设计和管理窗口内的控件位置。学习者将学习如何有效地利用Qt API文档,以查找和理解官方提供的功能和函数。创建对话框是Qt应用开发的重要部分,资料详细解释了如何构建和定制不同类型的对话框,如QFileDialog、QColorDialog、QMessageBox和QInputDialog等。 随着学习的深入,读者会接触到事件处理,包括事件的接收、忽略、自定义以及使用各种事件过滤器。QPainter模块的讲解则涉及图形绘制的高级技巧,如反走样、渐变填充、坐标变换和绘图设备管理。这部分内容对于提升界面视觉效果至关重要。 此外,资料还介绍了Qt的GraphicsView框架,它支持复杂的图形视图和用户交互。国际化是现代软件开发的必备技能,该指南也覆盖了如何使应用程序适应多语言环境。最后,讲解了Qt中的容器类,特别是顺序存储容器,这对于组织和管理数据非常有用。 这份资料提供了一个循序渐进的学习路径,适合希望系统学习和实践Qt的开发者,无论是从零开始还是希望提升现有技能。通过逐步探索,读者将能建立起坚实的Qt编程基础,并具备开发复杂应用程序的能力。
资源详情
资源推荐
Qt 学习之路 DZY 整理
Qt 学习之路(4):初探信号槽
看过了简单的 Hello, world! 之后,下面来看看 Qt 最引以为豪的信号槽机制!
所谓信号槽,简单来说,就像 是插销一样:一个插头和一个插座。怎么说呢?当某种事
件发生之后,比如,点击了一下鼠标,或者按了某个按键,这时,这个组件就会发出一个信
号。就像是广播 一样,如果有了事件,它就漫天发声。这时,如果有一个槽,正好对应上这
个信号,那么,这个槽的函数就会执行,也就是回调。就像广播发出了,如果你感兴趣, 那
么你就会对这个广播有反应。干巴巴的解释很无力,还是看代码:
#include <QtGui/QApplication>
#include <QtGui/QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QPushButton *button = new QPushButton("Quit");
QObject::connect(button, SIGNAL(clicked()), &a, SLOT(quit()));
button->show();
return a.exec();
}
这是在 Qt Creator 上面新建的文件,因为前面已经详细的说明怎么新建工程,所以这
里就不再赘述了。这个程序很简单,只有一个按钮,点击之后程序退出。(顺便说 一句,Qt
里面的 button 被叫做 QPushButton,真搞不明白为什么一个简单的 button 非得加上 push 呢?
呵呵)
主要 是看这一句:
QObject::connect(button, SIGNAL(clicked()), &a, SLOT(quit()));
QObject 是所有类的根。Qt 使用这个 QObject 实现了一个单根继承的 C++。它里面有一个
connect 静态函数,用于连接信号槽。
第 16 页 共 243 页 整理:DZY
Qt 学习之路 DZY 整理
当一个按钮被点击时,它会发出一个 clicked 信号,意思是,向周围的组件们声明:我
被点 击啦!当然,其它很多组件都懒得理他。如果对它感兴趣,就告诉 QObject 说,你帮我
盯着点,只要 button 发出 clicked 信号,你就告诉我—— 想了想之后,说,算了,你也别
告诉我了,直接去执行我的某某某函数吧!就这样,一个信号槽就形成了。具体来说呢,这
个例子就是 QApplication 的 实例 a 说,如果 button 发出了 clicked 信号,你就去执行我的
quit 函数。所以,当我们点击 button 的时候,a 的 quit 函数被调用,程序 退出了。所以,
在这里,clicked()就是一个信号,而 quit()就是槽,形象地说就是把这个信号插进这个槽
里面去。
Qt 使用信 号槽机制完成了事件监听操作。这类似与 Swing 里面的 listener 机制,只是
要比这个 listener 简单得多。以后我们会看到,这种信号槽的定义 也异常的简单。值得注意
的是,这个信号槽机制仅仅是使用的 QObject 的 connect 函数,其他并没有什么耦合——也
就是说,完全可以利用这种机制实 现你自己的信号监听!不过,这就需要使用 qmake 预处
理一下了!
细心的你或许发现,在 Qt Creator 里面,SIGNAL 和 SLOT 竟然变颜色了!没错,Qt 确
实把它们当成了关键字!实际上,Qt 正是利用它们扩展了 C++语言,因此才需要使 用 qmake
进行预处理,比便使普通的 C++编译器能够顺利编译。另外,这里的 signal 和 Unix 系统里面
的 signal 没有任何的关系!哦哦,有一 点关系,那就是名字是一样的!
信号槽机制是 Qt 关键部分之一,以后我们还会再仔细的探讨这个问题的。
第 17 页 共 243 页 整理:DZY
Qt 学习之路 DZY 整理
Qt 学习之路(5):组件布局
顾名思义,绝对定位就是使用最原始的定位方法,给出这个组件的坐标和长宽值。这样
Qt 就知道该把组件放在哪里,以及怎么设置组件的大小 了。但是这样做的一个问题是,如
果用户改变了窗口大小,比如点击了最大化或者拖动窗口边缘,这时,你就要自己编写相应
的函数来响应这些变化,以避免那些组 件还只是静静地呆在一个角落。或者,更简单的方法
是直接禁止用户改变大小。
不过,Qt 提供了另外的一种机制,就是布局,来解决这个问 题。你只要把组件放入某
一种布局之中,当需要调整大小或者位置的时候,Qt 就知道该怎样进行调整。这类似于
Swing 的布局管理器,不过 Qt 的布局没有那 么多,只有有限的几个。
来看一下下面的例子:
#include <QtGui/QApplication>
#include <QtGui/QWidget>
#include <QtGui/QSpinBox>
#include <QtGui/QSlider>
#include <QtGui/QHBoxLayout>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QWidget *window = new QWidget;
window->setWindowTitle("Enter your age");
QSpinBox *spinBox = new QSpinBox;
QSlider *slider = new QSlider(Qt::Horizontal);
spinBox->setRange(0, 130);
slider->setRange(0, 130);
第 18 页 共 243 页 整理:DZY
Qt 学习之路 DZY 整理
QObject::connect(slider, SIGNAL(valueChanged(int)), spinBox,
SLOT(setValue(int)));
QObject::connect(spinBox, SIGNAL(valueChanged(int)), slider,
SLOT(setValue(int)));
spinBox->setValue(35);
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(spinBox);
layout->addWidget(slider);
window->setLayout(layout);
window->show();
return app.exec();
}
这 里 使 用 了 两 个 新 的 组 件 : QSpinBox 和 QSlider , 以 及 一 个 新 的 顶 级 窗 口
QWidget。QSpinBox 是一个有上下箭头的 微调器,QSlider 是一个滑动杆,只要运行一下就
会明白到底是什么东西了。
代码并不是那么难懂,还是来简单的看一下。首先创建了一 个 QWidget 的实例,调用
setWindowTitle 函数来设置窗口标题。然后创建了一个 QSpinBox 和 QSlider,分别设置了它
们值的范 围,使用的是 setRange 函数。然后进行信号槽的链接。这点后面再详细说明。然后
是一个 QHBoxLayout,就是一个水平布局,按照从左到右的顺 序进行添加,使用 addWidget
添加好组件后,调用 QWidget 的 setLayout 把 QWidget 的 layout 设置为我们定义的这个
Layout,这样,程序就完成了!
编译运行一下,可以看到效 果:
第 19 页 共 243 页 整理:DZY
Qt 学习之路 DZY 整理
如果最大化的话:
虽然我并没有添加任何代码,但是那个 layout 就已经明白该怎样进行布局。
或许你发现,那两个信号槽的链接操作 会不会产生无限递归?因为 steValue 就会引发
valueChanged 信号!答案是不会。这两句语句实现了,当 spinBox 发出 valueChanged 信号
的时候,会回调 slider 的 setValue,以更新 slider 的值;而 slider 发出 valueChanged 信
号的时候,又会回调 slider 的 setValue。但是,如果新的 value 和旧的 value 是一样的话,
是不会发出这个信 号的,因此避免了无限递归。
迷糊 了 吧 ? 举 个 例 子 看 。比 如 下 面 的 spinBox->setValue(35) 执 行 的 时 候 ,首 先 ,
spinBox 会将自己的值设为 35,这样,它的值与原来的不一样了(在没有 setValue 之前的时
候,默认值是 0),于是它发出了 valueChanged 信号。slider 接收到 这个信号,于是回调自
己的 setValue 函数,将它的值也设置成 35,它也发出了 valueChanged 信号。当然,此时
spinBox 又收到了,不 过它发现,这个 35 和它本身的值是一样的,于是它就不发出信号,
所以信号传递就停止了。
第 20 页 共 243 页 整理:DZY
剩余242页未读,继续阅读
sxm426
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C语言快速排序算法的实现与应用
- KityFormula 编辑器压缩包功能解析
- 离线搭建Kubernetes 1.17.0集群教程与资源包分享
- Java毕业设计教学平台完整教程与源码
- 综合数据集汇总:浏览记录与市场研究分析
- STM32智能家居控制系统:创新设计与无线通讯
- 深入浅出C++20标准:四大新特性解析
- Real-ESRGAN: 开源项目提升图像超分辨率技术
- 植物大战僵尸杂交版v2.0.88:新元素新挑战
- 掌握数据分析核心模型,预测未来不是梦
- Android平台蓝牙HC-06/08模块数据交互技巧
- Python源码分享:计算100至200之间的所有素数
- 免费视频修复利器:Digital Video Repair
- Chrome浏览器新版本Adblock Plus插件发布
- GifSplitter:Linux下GIF转BMP的核心工具
- Vue.js开发教程:全面学习资源指南
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功