第一章:认识Qt

如何添加第三方库

  1. Qt Creater在pro文件下进行添加
  2. Vs2019在右键属性Qt设置里添加

QMake与CMake

qmakeqt独有的代码构建工具

cmakeC++通用的代码构建工具,绝大部分C++开源项目都是使用cmake管理代码,如obsjsoncpp

总结:

  1. 如果你主要在开发Qt应用程序,尤其是当你不需要复杂的自定义构建逻辑时,QMake可能是更简单直接的选择。
  2. 如果你的项目需要跨平台支持,或者你需要一种更灵活、功能更强大的构建系统,CMake可能是更好的选择。

Qt的三个窗口

  1. QMainWindow:是Qt提供的一个主窗口类,它为应用程序提供了一个带有菜单栏、工具栏、状态栏、和可选的停靠窗口(dock widgets)和中心窗口的主窗口。适合做应用程序的主界面
  2. QWidget:是所有用户界面对象的基类。它可以作为一个独立的窗口或者是其他窗口(如QMainWindowQDialog)中的一个组件使用。它通常被用来创建应用程序中的简单窗口或作为组合较复杂控件的基础。
  3. QDialog:是用于创建对话框的基类。通常用于短暂的交互,如收集用户输入、显示信息、询问用户决策等。

一些控件的介绍

QLabel

  • 设置文本void setText(const QString &);
  • 获取文本QString text() const;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 创建一个不需要UI的Widget
// 在widget.cpp中进行代码编写

#include "widget.h"
#include <QLabel>
#include <QVBoxLayout>
#include <QDebug>

Widget::Widget(QWidget *parent)
: QWidget(parent)
{
// 创建布局
QVBoxLayout *layout = new QVBoxLayout(this);

QLabel *label = new QLabel();
label->setText("this is jasonqian");

// void addWidget(QWidget *, int stretch = 0, Qt::Alignment alignment = Qt::Alignment());
// 需要传入QWidget,由于QLabel继承于QFrame,而QFrame继承于QWidget因此可以加入布局中
layout->addWidget(label);

// 获取文本
qDebug() << label->text();
}

Widget::~Widget() {}
  • 设置图片:void setPixmap(const Pixmap &);

如何传入Pixmap的参数?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static QString getOpenFileName(QWidget *parent = nullptr,
const QString &caption = QString(),
const QString &dir = QString(),
const QString &filter = QString(),
QString *selectedFilter = nullptr,
Options options = Options());

参数说明:
parent: 父窗口,一般填写this
caption: 打开窗口的标题
dir: 打开的目录
filter: 文件类型过滤器,例如*.txt, *.mp4, *.json

样例展示:
QString fileName = QFileDialog::getOpenFileName(this, "请选择图片", "C:/", "图片(*.png *.jpg);;");
注意:
";;":这部分是两个分号,用于指示过滤器字符串的结束。即使在这个例子中,它是多余的,因为只有一个过滤器,但它是必需的,以便告诉getOpenFileName()函数没有更多的过滤器了。

代码展示

1
2
3
4
5
6
7
8
9
10
11
QVBoxLayout *layout = new QVBoxLayout(this);

QString fileName = QFileDialog::getOpenFileName(this, "请选择图片", "C:/", "图片(*.png *.jpg);;");

QLabel *label = new QLabel();
label->setPixmap(fileName);

layout->addWidget(label);

// 获取文本
qDebug() << label->text();

QLineEdit

  • 设置文本void setText(const QString &);
  • 获取文本QString text() const;

QPushButton

  • 设置文本void setText(const QString &);
  • 获取文本QString text() const;

按钮点击QPushButton信号槽

  • 主要信号void clicked(bool checked = false);
  • 使用方法connect(按钮对象指针, &QPushButton::clicked, this, &界面类::槽函数)
  • 槽函数常用写法void on_空间名字_clicked();

槽函数需要在头文件.h中写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class Widget : public QWidget
{
Q_OBJECT

private slots:
void on_btn_clicked();
...
};
#endif // WIDGET_H

widget.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "widget.h"
#include <QPushButton>
#include <QVBoxLayout>
#include <QDebug>

Widget::Widget(QWidget *parent)
: QWidget(parent)
{
// 创建布局
QVBoxLayout *layout = new QVBoxLayout(this);

QPushButton *btn = new QPushButton(this);
btn->setText("jasonqian");

layout->addWidget(btn);

// 进行连接
connect(btn, &QPushButton::clicked, this, &Widget::on_btn_clicked);
}

Widget::~Widget() {}

// 实现槽函数
void Widget::on_btn_clicked()
{
qDebug() << "jasonqian";
}