以 “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. jQuery页面顶部下拉广告

    本广告可以是图片也可以是Flash,可以设置自动播放的时间,可以手动停止和重播. 效果展示 http://hovertree.com/texiao/jquery/80/ 源码下载:http://hov ...

  2. WPF平台Grid控件性能比较

    WPF官方发布第一个版本至今已经有10年了, 我们几乎在同时也开始了XAML开发.即使经过多年打造,我们依旧尝试提高:我们真的成功打造了高效灵活的控件吗?我没有在其他地方找到任何关于优秀的WPF表格性 ...

  3. a标签有小手状和无小手状css属性

    有小手状: <a href="##" title="2" style="cursor:pointer"> 无小手状: <a ...

  4. No.009:Palindrome Number

    问题: Determine whether an integer is a palindrome. Do this without extra space. 官方难度: Easy 翻译: 不使用额外空 ...

  5. Lind.DDD.Repositories.Redis层介绍

    回到目录 之前已经发生了 大叔之前介绍过关于redis的文章,有缓存,队列,分布式pub/sub,数据集缓存以及仓储redis的实现等等,而今天在Lind.DDD的持久化组件里,redis当然也有一席 ...

  6. http cancelled状态与ajax 超时

    在最近一周,我们的前端在测试某些批量超过的某个步骤时,发现请求好像发出来,但是后台状态没有变化,说是最近才出现的问题,以前一直都是正常的,两天连续出现两次之后,来找笔者,首先检查了下中间件的日志,发现 ...

  7. (原)3.2 Zookeeper应用 - 数据的发布与订阅

    本文为原创文章,转载请注明出处,谢谢 数据的发布与订阅 1.应用 服务端监听数据改变,客户端创建/更新节点数据,客户端提供数据,服务端处理 2.原理 客户端监控节点数据改变事件(例如配置信息,下图的c ...

  8. 使用javascript改变图片路径

    效果预览:http://keleyi.com/keleyi/phtml/jstexiao/16.htm 代码如下: <!DOCTYPE html> <html> <hea ...

  9. mvp+retrofit+rxjava

    引用 "retrofit" : "com.squareup.retrofit2:retrofit:2.0.1", "retrofit-adapter& ...

  10. Redis 键(key)相关的命令及其它命令的查看地址

    Redis 键(key) Redis 键命令用于管理 redis 的键. 语法 Redis 键命令的基本语法如下: redis 127.0.0.1:6379> COMMAND KEY_NAME ...