chapter1 Qt入门

chapter1. Qt入门

初次结识Qt,是因为暑假里老师布置的一项任务,要写一个桌面端的程序出来,简单的了解了一下,感觉Windows环境下的WPF框架确实也不错,但那是用C#写的,我没有学过,重新去学一门新的语言,时间成本无疑太高.本科的时候学过C++,虽算不上太精通,多少上手会容易些.而且Qt的跨平台特性,也深深地吸引到我......

为了快速的上手,我买了本二手的Qt Creator快速入门,里面有很多现成的例子,上手也的确容易.这本书最近这几天差不多看完了,感觉基础很不牢靠,一些核心的概念,理解的很不透彻.开始继续看另一本书,C++ GUI Qt4编程,这个博客也是用来记录之后的学习过程.刚看了第一章,对比一下,觉得霍亚飞的那本书,写的实在是有些不敢苟同,书名的确很切题,也就是入门,而已.

先声明一下,电脑环境配置:Ubuntu 16.04 + Qt 5.7 .话不多说,直接进入正题.

1.Hello

hellp.cpp

#include <QApplication>
#include <QLabel>

int main(int argc, char *argv[]){
    QApplication app(argc, argv);
    QLabel *label = new QLabel("<h2><i>Hello </i>"
                                "<font color=red>Qt!</font></h2>");
    label->show();
    return app.exec();
}

下面就是Qt最精彩的地方,也就是施展如何用一份源代码,编译跨平台的软件.

qmake -project 生成与平台无关的.pro文件

qmake hello.pro 生成与平台无关的makefile文件

make 编译程序

/.hello 运行程序

另外也可以看到,QT接受HTML格式的字符串,并且对其进行解读和渲染.

这里有一点需要注意:生成的.pro文件里要添加Qt += widgets,否则无法编译通过

2.建立连接

quit.cpp

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[]){
    QApplication app(argc, argv);
    QPushButton *button = new QPushButton("Quit");
    QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()));
    button->show();
    return app.exec();
}

与上面完全一样的编译流程.这个程序展示了信号-槽的概念,几乎是Qt最核心的概念:当有信号发射,与之连接的槽就会立马响应,执行槽内的处理.有点回调的意味.

3.窗口部件的布局

layout.cpp

#include <QApplication>
#include <QHBoxLayout>
#include <QSlider>
#include <QSpinBox>

int main(int argc, char *argv[]){
    QApplication app(argc, argv);

    QWidget *window = new QWidget;
    window->setWindowTitle("Enter Your Age");

    QSpinBox *spinBox = new QSpinBox;
    QSlider *slider = new QSlider(Qt::Horizontal);
    spinBox->setRange(0, 130);
    slider->setRange(0, 130);

    QObject::connect(spinBox, SIGNAL(valueChanged(int)),
                    slider, SLOT(setValue(int)));
    QObject::connect(slider, SIGNAL(valueChanged(int)),
                    spinBox, SLOT(setValue(int)));
    spinBox->setValue(35);

    QHBoxLayout *layout = new QHBoxLayout;
    layout->addWidget(spinBox);
    layout->addWidget(slider);
    window->setLayout(layout);

    window->show();

    return app.exec();

}

这个程序比较长,也更复杂一些.不仅涉及到信号-槽,而且有了布局的参与,布局管理器可以对窗口控件的大小,排列,还有位置进行控制,使得界面更整齐合理.

通常我们先声明所需的部件,再设置它们的属性,然后将它们放入布局管理器中,最后才显示出来.

这里涉及到一些技术上的事.在Qt中,每个窗体控件都有父对象,但这里的spinBox和slider却没有声明.这是因为它们被放入布局管理器中,而这个布局管理器又被注册到Widget中,因为父对象就被隐式的给出来了

总结:这是这一系列博客的第一章,比较简单,都是一些简单的概念,没有深入进去.即使是想qmake这样的命令,也是有着复杂的参数,要继续学习方能理解透彻.Qt自带有assistant帮助文档,以及example示例,都是重要的学习来源!

却道,此心安处是吾乡
原文地址:https://www.cnblogs.com/lucifer25/p/7683611.html