• 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
  • 相关阅读:
    【洛谷】P1303 A*B Problem(高精度乘法模板)
    快速幂
    【洛谷】P1601 A+B Problem 高精(高精度加法模板)
    进制转换
    【洛谷】P1551 亲戚(并查集模板)
    求最大公约数的两种方法
    快速排序
    异或交换两个数
    数字字符串互相转换的三种方法
    Hello world(我来啦)
  • 原文地址:https://www.cnblogs.com/loenvom/p/14316134.html
Copyright © 2020-2023  润新知