以 “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 之 入门例程 (一)的更多相关文章

  1. Qt 之 入门例程

    以 “Hello Qt” 为例,介绍如何建立一个 Qt 工程 . 1  QLabel 例程 QLabel 用来显示文本和图片,它继承自 QFrame (而 QFrame 继承自 QWidget) 1. ...

  2. Qt 之 入门例程(二)

    本文以 Qt 中的 QtConcurrent::run() 函数为例,介绍如何将函数运行在单独的某一个线程中. 1  QtConcurrent::run() QtConcurrent 是一个命名空间, ...

  3. Qt快速入门系列教程目录

    Qt快速入门系列教程目录

  4. Qt快速入门学习笔记(基础篇)

    本文基于Qter开源社区论坛版主yafeilinux编写的<Qt快速入门系列教程目录>,网址:http://bbs.qter.org/forum.php?mod=viewthread&am ...

  5. 第15.10节 PyQt(Python+Qt)入门学习:Qt Designer可视化设计界面组件与QWidget类相关的组件属性详解

    PyQt学习有阵子了,对章节的骨架基本考虑好了,准备本节就写组件的属性的,结果一是日常工作繁忙,经常晚上还要加班,二是Qt的组件属性很多,只能逐一学习.研究和整理,花的时间有点长,不过终于将可视化设计 ...

  6. QT从入门到入土(二)——对象模型(对象树)和窗口坐标体系

    摘要 我们使用的标准 C++,其设计的对象模型虽然已经提供了非常高效的 RTTI 支持,但是在某些方面还是不够灵活.比如在 GUI 编程方面,既需要高效的运行效率也需要强大的灵活性,诸如删除某窗口时可 ...

  7. QT从入门到入土(三)——信号和槽机制

    摘要 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号 (signal).这种发出是没有目的的,类似广播 ...

  8. Qt Creator 入门

    Qt 的入门我觉得可以直接从窗口开始,而不是什么"Hello World!".因为Qt 是一个基于图形界面的编程软件,图形界面编程是其核心所在.很久以前,那时候还是Shell编程, ...

  9. QT从入门到入土(四)——多线程(QtConcurrent::run())

    引言 在前面对Qt多线程(QThread)做了详细的分析:QT从入门到入土(四)--多线程(QThread) - 唯有自己强大 - 博客园 (cnblogs.com) 但是最近在做项目时候,要将一个函 ...

随机推荐

  1. [WCF编程]6.绑定行为

    一.绑定行为概述 为了支持服务端的其它本地特性,WCF定义了行为的概念.行为就是服务的本地特性,不会影响服务的通信模式.客户端并不知道服务端行为,所以行为不会出现在服务的绑定和发布的元数据中.说下WC ...

  2. 找不到方法:"!!0[] System.Array.Empty()".

    找不到方法:"!!0[] System.Array.Empty()". 这个原因是没装.net framework 4.6

  3. python中global 和 nonlocal 的作用域

    python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 . 一 global global关键字用来在函数或其他局部作用域 ...

  4. 【系统架构】缓存Memcache 使用原子性操作add,实现并发锁

    原文地址 memcache中Memcache::add()方法在缓存服务器之前不存在key时, 以key作为key存储一个变量var到缓存服务器.我们使用add来向服务器添加一个键值对应,如果成功则添 ...

  5. MongoDB配置服务--MongoDB安装成为windows服务

    MongoDB安装成为windows服务 1.打开命令提示符(最好以管理员的身份打开),然后输入: mongod --logpath "D:\MongoDB\data\log\logs.tx ...

  6. Hibernate 小阶段总结

    (一)Hibernate入门 通俗的话来说:Hibernate是用于面向对象操控数据库,对JDBC进行轻量级封装.(在java世界中传统的来说是JDBC访问数据库.) 1)Hibernate定性:对象 ...

  7. 字体属性设置(一):谷歌浏览器12px以下字体的显示;方法和原理

    前言: chrome 谷歌浏览器默认的字体大小为16px:可以通过设置font-size来设置字体大小但是当设置到12px以下的时候字体大小不再改变:对于想设置其他大小的字体就很头疼,本文参考网上的方 ...

  8. arcgis for flex展示GIS基本功能

    1.地图框选搜索: 这是空间查询,在地图上框选一定的范围,然后搜索出在这个范围之内的所有信息,搜索到的详细信息在列表框显示出来 2.属性查询: 3.数据库展示: 4.绘制图形: 地图上绘制各种不同形状 ...

  9. 国内好用的maven仓库,添加到本地nexus中

    速度快的maven仓库真的难找,国外网站很多被封了.前天在网上找,有人说阿里有个公开的,速度很快.确实很快! 我添加到本地nexus中,结果不能更新索引,我是这么添加的,如下: 这个地址在浏览器中能够 ...

  10. iOS开发-UI 从入门到精通(二)

    iOS开发-UI 从入门到精通(二)是对 iOS开发-UI 从入门到精通(一)知识点的巩固,主要以习题练习为主,增强实战经验,为以后做开发打下坚实的基础! ※开发环境和注意事项: 1.前期iOS-UI ...