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) 但是最近在做项目时候,要将一个函 ...
随机推荐
- /.nav-tabs :是普通标签页 .nav-pills:胶囊式标签页 action ;默认的激活项,给<li>加默认显示的是哪个标签页内容 .nav是标签页的一个基类,给ul加 .nav-stacked: 垂直排列BootStrap
<meta name="viewport" content="with=device-width, initial-scale=1, user-scalabe=no ...
- innerText和innerHTML, outerHTML
js中 innerHTML与innerText的用法与区别及解决Firefox不支持Js的InnerHtml问题 用法: <div id="test"> <spa ...
- AM335x内核模块驱动之LED
在Ubuntu的任意可操作的文件才建立text目录 在text中建立zyr-hello.c: #include<linux/kernel.h> #include<linux/modu ...
- Hibernate lazy(延迟加载)
Hibernat加载策略有两种,分别为即时加载和延迟加载(懒加载或者lazy),get使用的是即时加载,使用get获取数据时会立即查找(会先去缓存查找,如果缓存中没有找到,才会去数据库中查找),而lo ...
- 活动a 使用 启动为结果 方法 启动 活动 b, b什么都不做 并返回给a,a中的 在活动结果时候 回调 是否被执行?
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 活动a 使用 启动为结果 方法 启动 活动 b, b什么都不做 并返回给a,a中的 在活 ...
- 【20181027T2】易水决【贪心+堆】
原题:loj6035 [错解] 全肝T1了没怎么想 [正解] 一眼贪心 先考虑\(b_i=0\)怎么做 可以模拟一个正常人的思维 开一个堆,记录每个任务需要的时间(包括等待),每次从中取出一个任务,表 ...
- SpringMVC 常用注解 详解
SpringMVC 常用注解 详解 SpringMVC 常用注解 1.@RequestMapping 路径映射 2.@Requ ...
- 同步IO与同步非阻塞IO的理解
本文图片均来自网络 一.同步IO---Blocking IO 在Blocking IO模型中,用户空间的应用程序执行一个系统调用(recvform),这会导致应用程序阻塞,直到数据准备好,并且将数据从 ...
- Shell基础学习(四) echo命令
1.显示普通的字符串 echo "boring" 2.显示转义字符 echo "\"It is a test!\""; 3.read 命令从 ...
- TPS5410/TPS5430 开关电源稳压器(DC-DC)