Qt 之 入门例程 (一)
以 “Hello Qt” 为例,介绍如何建立一个 Qt 工程 。
1 QLabel 例程
QLabel 用来显示文本和图片,它继承自 QFrame (而 QFrame 继承自 QWidget)
1.1 Hello Qt
#1 和 #2 标明头文件,也可用一个总的来代替: #include <QtWidgets>
#6 创建 QApplication 类对象,配合 #11 使整个程序进入事件循环状态,等待用户的动作;
#8 创建 QLabel 对象 label 并赋初值 “Hello Qt!”, 接着 #9 显示出该对象。
#include <QApplication>
#include <QLabel> int main(int argc, char *argv[])
{
QApplication app(argc, argv); QLabel label("Hello Qt!");
label.show(); return app.exec();
}
自动生成的工程配置文件 .pro 如下:
QT += core gui greaterThan(QT_MAJOR_VERSION, ): QT += widgets TARGET = HelloQt
TEMPLATE = app SOURCES += main.cpp
支持 HTML 风格
QLabel label("<h2><i>Hello</i>" "<font color=red>Qt!</font></h2>");

1.2 智能指针
下面程序因为简短,关闭后,操作系统会负责回收内存,但是这种 new 了之后不 delete 的方式是不推荐的。
QLabel *label = new QLabel("Hello Qt!");
9 label->show();
1) Qt 的智能指针
如果使用指针,可以考虑 Qt 中的智能指针 QScopedPointer
QScopedPointer<QLabel> label(new QLabel("Hello Qt!"));
2) c++ 的智能指针
也可使用 c++ 中的智能指针 std::unique_ptr,注意包含头文件 #include <memory>
std::unique_ptr<QLabel> label = std::make_unique<QLabel>("Hello Qt!");
2 QPushButton 例程
使用 QPushButton 类,新建一个按钮指针 btn,设置其父窗口为 &window,这样当 window 被销毁,就会自动删除 btn,这其实是 Qt 中特有的“拥有权”问题,它可使编程中 new 了不用 delete
connect 将信号 clicked() 和槽函数 quit() 连接了起来,当点击按钮时,clicked() 信号被发出,接着槽函数被执行,于是程序退出。这称为 "信号槽" 机制。
#include <QtWidgets> int main(int argc, char *argv[])
{
QApplication app(argc, argv); QWidget window;
window.resize(, );
window.setWindowTitle("Button");
window.show(); QPushButton *btn = new QPushButton("Quit", &window);
QObject::connect(btn, SIGNAL(clicked()), &app, SLOT(quit()));
btn->move(,);
btn->show(); return app.exec();
}
界面如下:

3 QSpinBox 和 QSlider
实现如下界面,包含 spinbox 和 slider 两个控件,且二者的数值互相关联。

#1 ~ #4 包含所需头文件,#10 和 #11 新建窗口部件,作为顶层窗口 (top-level), #13 ~ #16 新建 spinbox 和 slider 控件指针,取值范围 0~130;
#18 和 #19 将二者连接起来, 使得 spinbox 和 slider 的数值保持实时同步; #22 新建 layout 布局管理器指针;
#23 和 #24 将两个控件加入布局管理器 layout 中, #26 在窗体部件上安装布局管理器 layout,此时 QHBoxLayout 以及它包含的 QSpinBox 和 QSlider 会自动 "重新定义" 父窗口,QWidget 会取得它们的所有权,这也是它们在创建时没有设置父窗口的原因; #27 显示出整个窗体部件。
#include <QApplication> // #include <QtWidgets>
#include <QHBoxLayout>
#include <QSpinBox>
#include <QSlider> int main(int argc, char *argv[])
{
QApplication app(argc, argv); QWidget window;
window.setWindowTitle("Enter Your Age"); QSpinBox *spin = new QSpinBox;
QSlider *slider = new QSlider(Qt::Horizontal);
spin->setRange(,);
slider->setRange(,); QObject::connect(spin, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
QObject::connect(slider, SIGNAL(valueChanged(int)), spin, SLOT(setValue(int)));
spin->setValue(); QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(spin);
layout->addWidget(slider); window.setLayout(layout);
window.show(); return app.exec();
}
Qt 中有三个布局管理器类,分别是水平布局管理器 (QHBoxLayout), 垂直布局管理器 (QVBoxLayout), 以及网格布局管理器 (QGridLayout)
这些布局管理器,可以为加入其中的控件自动分配位置和尺寸大小,省却了手动布局画图的繁琐。
参考资料:
<C++ GUI Programming with Qt4> 2nd chapter 1
<Qt 5.9 | All Qt Examples> Widgets Tutorial - Child Widgets
<Qt 学习之路2> 豆子 https://www.devbean.net/2012/08/qt-study-road-2-hello-world/
Qt 之 入门例程 (一)的更多相关文章
- Qt 之 入门例程
以 “Hello Qt” 为例,介绍如何建立一个 Qt 工程 . 1 QLabel 例程 QLabel 用来显示文本和图片,它继承自 QFrame (而 QFrame 继承自 QWidget) 1. ...
- Qt 之 入门例程(二)
本文以 Qt 中的 QtConcurrent::run() 函数为例,介绍如何将函数运行在单独的某一个线程中. 1 QtConcurrent::run() QtConcurrent 是一个命名空间, ...
- Qt快速入门系列教程目录
Qt快速入门系列教程目录
- Qt快速入门学习笔记(基础篇)
本文基于Qter开源社区论坛版主yafeilinux编写的<Qt快速入门系列教程目录>,网址:http://bbs.qter.org/forum.php?mod=viewthread&am ...
- 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解
PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...
- QT从入门到入土(二)——对象模型(对象树)和窗口坐标体系
摘要 我们使用的标准 C++,其设计的对象模型虽然已经提供了非常高效的 RTTI 支持,但是在某些方面还是不够灵活.比如在 GUI 编程方面,既需要高效的运行效率也需要强大的灵活性,诸如删除某窗口时可 ...
- QT从入门到入土(三)——信号和槽机制
摘要 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号 (signal).这种发出是没有目的的,类似广播 ...
- Qt Creator 入门
Qt 的入门我觉得可以直接从窗口开始,而不是什么"Hello World!".因为Qt 是一个基于图形界面的编程软件,图形界面编程是其核心所在.很久以前,那时候还是Shell编程, ...
- QT从入门到入土(四)——多线程(QtConcurrent::run())
引言 在前面对Qt多线程(QThread)做了详细的分析:QT从入门到入土(四)--多线程(QThread) - 唯有自己强大 - 博客园 (cnblogs.com) 但是最近在做项目时候,要将一个函 ...
随机推荐
- Devexpress RaisePropertyChanged
所有的重载设置字段作为参数传递到指定的值,而属性提高INotifyPropertyChanged.PropertyChanged事件. 如果一个字段已经成功地改变,setProperty方法中返回真. ...
- Unity3D 5.x 简单实例 - 脚本编写
1,Vector3 类型变量存储向量坐标值 Vector3.forward Vector3(0,0,1) Vector3.up Vector3(0,1,0) Vector3.right Vector3 ...
- Home / Python MySQL Tutorial / Calling MySQL Stored Procedures in Python Calling MySQL Stored Procedures in Python
f you are not familiar with MySQL stored procedures or want to review it as a refresher, you can fol ...
- GTD工具 Wunderlist使用心得总结
前言: 先后使用过do.it.omnifocus,最后选择了wunderlist,看了他拓展性强.跨平台.免费三大优点.Wunderlist只是一个工具,重要是的GTD的思路.下面的分享是本人的使用案 ...
- B-Tree索引在sqlserver和mysql中的应用
在谈论数据库性能优化的时候,通常都会提到“索引”,但很多人其实并没有真正理解索引,也没有搞清楚索引为什么就能加快检索速度,以至于在实践中并不能很好的应用索引.事实上,索引是一种廉价而且十分有效的优化手 ...
- 【blade的UI设计】理解前端MVC与分层思想
前言 最近校招要来了,很多大三的同学一定按捺不住心中的焦躁,其中有期待也有彷徨,或许更多的是些许担忧,最近在开始疯狂的复习了吧 这里小钗有几点建议给各位: ① 不要看得太重,关心则乱,太紧张反而表现不 ...
- HTML5移动端图片左右切换动画
插件描述:HTML5移动端图片左右切换动画 小海今天要给大家分享一款很不错的图片左右切换焦点图动画,并且支持移动端触摸滑动.功能上,这款HTML5图片播放器支持鼠标滑动.手机端触摸滑动以及自动播放.外 ...
- iOS 证书Bug The identity used to sign the executable is no longer valid 解决方案
现象:The identity used to sign the executable is no longer valid Please verify that your device’s cloc ...
- UIScrollView出现位移问题
啦啦啦啦啦~~~ UINavigationController和UIScrollView一起使用时会导致UIScrollView位置偏移 情况:UINavigationController的视图上的第 ...
- 好用的第三方控件,Xcode插件(不断更新)
第三方控件类: 1.提示框 MBProgressHUD: 是一款非常强大的.提供多种样式的提示框.使用起来简单.方便.可以在GitHub上查看具体的使用方法. https://github.com ...