开始动手项目了,边看边学习吧。
由于是初期阶段,配置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
槽的定义
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
然后是使用
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");
最后是练习的内容
点击按钮,弹出一个窗口,再次点击,关闭窗口。
先上效果图
在做这个联系的时候遇到了一个问题
默认情况下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 }