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 (继承自 QWidget),主要用来显示文本和图片. 1.1 Hell ...
- 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) 但是最近在做项目时候,要将一个函 ...
随机推荐
- Python 脚本编程及国际化
在前一篇博客文章 <使用 Python 编写脚本并发布> 中,我介绍了如何使用 Python 进行脚本编程,说实话这是我在尝试 Python 进行网站和网络编程之后首次使用 Python ...
- 连接LilyPad之Linux平台的驱动
连接LilyPad之Linux平台的驱动 常用的Linux发行版都自带了FTDI驱动,因此在绝大多数Linux发行版中不需要用户进行额外的操作. 在LilyPad编程器被正确驱动后,就可以将LilyP ...
- OpenGL的一些重要函数记录
glViewport - set the viewport https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glViewport.x ...
- FastReport.Net使用:[19]复选框的使用
FastReport中,用好复选框会使报表更美观. 复选框的用法举例: 1.点菜系统中,打印用户点菜时,将已点的菜进行打“√”标记等. 2.选课系统中,将已选科目进行打“√”等. 认识复选框 复选框只 ...
- Virtual Judge SPOJ - LCS2 Longest Common Substring II
https://vjudge.net/problem/SPOJ-LCS2 SPOJ注册看不到验证码,气到暴毙,用vjudge写的. 注意!(对拍的时候发现)这份代码没有对只有一个字符串的情况进行处理! ...
- 【ArcGIS笔记】数据处理
1.ARCGIS在导入Excel坐标点的时候出现"没有注册类"的情况怎么办? 确保你本机上装有office,并且版本要能够识别XLSX格式.2007以上. 2.导入excel时re ...
- Java之多线程 Semaphore(信号量)
一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者. ...
- 获取 ext grid 选中行 对象
在ext grid 中如何确定选中行?如何获取选中行数据? 其实很简单,用到了Ext.getCmp('id'),他可以获取到指定id的对象. grid 获取行对象: var row = Ext.get ...
- hadoop招聘需求每天都在添加,短短半个月时间,需求量差点儿翻了一番,这是大数据要爆发的节奏么?
近期常常关注企业hadoop招聘需求的动态变化,多说无益,直接上几张百度的截图: 4月20日: 4月22日: 4月27日: 5月8日:
- printf回到上一行开头以及回到本行开头的方法
回到上一行开头 #include <stdio.h> #include <unistd.h> int main(void) { ; ){ printf("%d\n&q ...