Qt-学习-第一阶段

开始动手项目了,边看边学习吧。

由于是初期阶段,配置QtCreator都花了很多的时间。

在官网鼓捣了半天也没整明白。

最后找了清华的suna资源站,清晰明了,点赞。

给个链接:

https://mirrors.tuna.tsinghua.edu.cn/

找到资源之后,开始安装,全选要12G的安装包,觉得没必要,于是之间默认安装。

但是问题又来了,默认安装包是没有运行环境的,于删了重来。

然后是正儿八经的知识点了。

一、Widget 项目结构

1、.pro 

Qt的项目文件,相当于整个程序的目录,用QtCreator打开这个文件,就会打开整个项目。

2、Headers

这是一个头文件夹。里面包括Widget.h 由于我创建的默认项目,所以名字就是这个,实际上上是可以改变的。

3、Sources

这是资源文件夹。里面包括Widget.cpp main.cpp, 前者实际定义了Widget,后者运行了Widget

4、Form

这个是UI文件夹。可以使用QtDesigner可视化开发

但是我很排斥这个,觉得用代码做页面布局会来得更高效清晰。

二、对象树

由于C++的本质是面向对象编程,而Qt基于C++开发,这里面就有很多的类的创建。

完成对于类的父亲声明之后,那么就可以通过对象树来统一释放资源,这个就很好。

三、信号和槽

对于开发来说,将两个事件关联起来这个事情是最基本的事情。

Qt对于这一点有很好的支持,直接看代码吧。

信号的定义

 1 #ifndef MYSIGNAL_H
 2 #define MYSIGNAL_H
 3 
 4 #include <QObject>
 5 
 6 class MySignal : public QObject
 7 {
 8     Q_OBJECT
 9 public:
10     explicit MySignal(QObject *parent = nullptr);
11 
12 signals:
13     void Wanna();
14     void Wanna(QString content);
15 public slots:
16 
17 };
18 
19 #endif // MYSIGNAL_H
View Code

槽的定义

 1 #ifndef MYSLOT_H
 2 #define MYSLOT_H
 3 
 4 #include <QObject>
 5 
 6 class MySlot : public QObject
 7 {
 8     Q_OBJECT
 9 public:
10     explicit MySlot(QObject *parent = nullptr);
11 
12 signals:
13 
14 public slots:
15        void Give();
16        void Give(QString content);
17 };
18 
19 #endif // MYSLOT_H
View Code

然后是使用

 1     // 定义信号量和槽
 2     MySignal * signal = new MySignal();
 3 
 4     MySlot * slot = new MySlot();
 5 
 6     // 获取地址
 7     void (MySignal::* signaladdress)(QString) = &MySignal::Wanna;
 8     void (MySlot::*slotaddress)(QString) = &MySlot::Give;
 9 
10     // 连接两个事件
11     // 也可以是信号和信号关联,信号和匿名函数
12     connect(signal, signaladdress, slot, slotaddress);
13 
14     // 出发信号
15     emit signal->Wanna("offer");
View Code

最后是练习的内容

点击按钮,弹出一个窗口,再次点击,关闭窗口。

先上效果图

在做这个联系的时候遇到了一个问题

默认情况下Widget会被创建在屏幕的中央,但是输出x,y属性却都是 0,之后研究一下。

然后是代码:

 1 #include "widget.h"
 2 #include "ui_widget.h"
 3 #include <QPushButton>
 4 #include <QDebug>
 5 #include "mysignal.h"
 6 #include "myslot.h"
 7 Widget::Widget(QWidget *parent) :
 8     QWidget(parent),
 9     ui(new Ui::Widget)
10 {
11     ui->setupUi(this);
12 
13     this->setFixedSize(600, 400);
14     this->setWindowTitle("练习");
15 
16     this->move(0, 0);
17 
18     QPushButton *btn = new QPushButton(this);
19     btn->setFixedSize(100, 50);
20     btn->move((600 - 100) / 2, (400 - 50) / 2);
21     btn->setText("创建窗体");
22 
23     QWidget * new_widget = NULL;
24 
25     connect(btn, &QPushButton::clicked, [=]()mutable{
26         if(new_widget == NULL)
27         {
28             new_widget = new QWidget();
29             new_widget->setWindowTitle("我是你创建的窗口");
30             new_widget->move(600, 0);
31             new_widget->show();
32             btn->setText("关闭窗口");
33         }else {
34             new_widget->close();
35             delete new_widget;
36             new_widget = NULL;
37             btn->setText("创建窗体");
38         }
39     });
40 
41 
42 }
43 
44 Widget::~Widget()
45 {
46     delete ui;
47 }
48 
49 void Widget::SayHi()
50 {
51       qDebug()<<"Hello lonvom";
52 }
View Code
原文地址:https://www.cnblogs.com/loenvom/p/14316134.html