Qt

本贴最后更新于 347 天前,其中的信息可能已经沧海桑田

命令行使用

找到这个路径 C:\Qt\5.15.2\mingw81_32\bin​ ,然后设置 Windows 环境变量,设置在系统环境变量的 PASS 里。

配置编译路径

和 VS 的操作逻辑差不多.

就把 Qt 看成一个库,QC 是个代码编译器。

关于项目文件的问题

QT 生成工程后没有.pro https://blog.csdn.net/weixin_43910828/article/details/128518328/

添加新的类和 VS 里操作一样的。但是创建的时候要注意继承自哪个类。

打开一个已有项目

https://blog.csdn.net/qq_41550190/article/details/118573377

包、重要文件

qmake

当把 Qt 项目发给别人的时候,可以删掉.list 和.user 文件。

Assistant:这个是帮助文档

image

image找不到相关函数的就按照继承关系找它的父类。

Linguist:翻译,用来程序中出现 tr("字符串")的字符串,而不是翻译英语的

Designer:设计师,用来设计窗口,Qt Creator 里面自带了

剩下的控制台是可以用来发布程序,需要注意的是,使用什么环境来编译的代码,那么就需要对应的控

制台来发布,可以通过括号里面的内容看对应的环境

Qt Creator:编辑工具

.pro 文件解释

QT       += core gui   Qt包含的模块

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets  //大于4版本以上 包含 widget模块

TARGET = 01_FirstProject  //目标   生成的.exe程序的名称
TEMPLATE = app       	  //模板   应用程序模板  Application  

SOURCES += main.cpp\      //源文件
        mywidget.cpp

HEADERS  += mywidget.h    //头文件

代码要求

image

image

image

双击 main.cpp 文件就可以看到 c/c++ 的入口函数,里面的 a 对象,a.exec()​是消息循环,如果自己创建的空项目来写,那么要记得写,里面的 w 对象,就是窗口对象,然后 show()​成员是用来显示窗口的

入门

Qt5 模块

Qt 对象树

显示 helloworld

欢迎:最开始的界面,可以看示例,打开之前的项目,new Project 所在的界面

编辑:写代码时的界面

设计:双击了 ui,进入的界面,在这里面进行对界面的设置

Debug:在编辑界面中多出来一些调试的窗口,调试界面

项目:项目相关的一些信息

帮助:QT 的帮助文档

​​

.por 文件:项目文件,可以看到项目包含的外部库,等等信息

headers:.h 文件

Sources:.cpp 文件

forms:ui 文件(窗口资源)双击 ui 文件可以打开到设计的界面对整个窗口进行操作

debug:调试模式,可以切换成 release 发布模式

绿色的三角形:运行

绿色的三角形带一个昆虫:调试(速度很慢)

锤子:构建(类似 VS 重新生成,建议大家界面上面放好控件之后点击一下构建)

image

双击.ui 文件,可以打开到设计界面

image

在这个界面中,QT 提供的常用控件,在窗口的左边,

在右上角是对象和定义这个对象的类,右下角是属性,属性是可以直接修改就可以在窗口上面看到效果

image

双击.ui 文件

1、在常用控件中,拖入 Label 控件,双击 Label 控件可以直接修改文字

2、点击 Label 控件,在属性里面修改 font,点大小为 40,还可以修改一下字体等等

3、右键控件点击改变样式表,添加颜色下拉,点击 color,选择一个颜色

4、点击绿色的三角形运行(CTRL+R)

适当调整一下 Label 控件的位置,那么就可以显示一个 hello world 在窗口上面

发布程序

步骤:

1、将 Debug 模式改为 release 模式

2、运行(运行不成功需要修改错误直到运行成功)

image

写完代码之后,点一下左下角锤子,右下角全绿了之后再运行程序。改为 release 模式后一定要点击锤子按钮构建一下项目(如果之前没构建的话)。

image

3、打开 Qt 5.9 for Desktop (MinGW 5.3.0 32 bit)在开始菜单中去找(因为我们所使用的是 mingw 的

环境来编译的代码) 构建目录一般和项目目录在一起的,里面有 debug 文件。

image

4、通过 cd 命令,进到 exe 所在的位置,构建文件夹下的 release 文件夹下,构建目录通常在项目文件夹同级目录下。

​​

注意安装的环境和项目的环境有可能不在同一个位置。

image

找对应的运行环境。并以管理员方式运行(一般是这样)。

注意,不同盘符不能通过 cd 命令直达。直接 D:

image

然后再 cd 进构建文件夹下的 release 文件夹下。

可以用 dir 命令看一下这个目录下都有什么。

image

5、通过 windeployqt 名字.exe 发布程序

发布完成之后就可以看到在 exe 的文件夹中生成出来了很多 QT 的库,这些库就是在运行 exe 所依赖的库,因为 QT 依赖的是自己的框架,当你要这个程序发给别人使用的时候,那么就需要把 release 文件夹下的全部发送过去。

image

注意:如果有用到外部库,那么需要自己将外部库的 dll 文件自己手动复制过来

image

以这种拓展名结尾的文件可以都删掉。里面有一些关键信息的,不需要发布的时候给人家暴露出来。

信号与槽

QT 信号与槽是 QT 中重要的机制之一,通过这种机制,对象间的通信变得非常简单和灵活。

一个信号就是一个对象发出的消息,槽是用于接收消息的对象的特殊函数。当信号被发射时,所有已连

接的槽函数都会被自动调用,从而实现对象间的通信。(类似消息机制)

类必须满足两个条件:1、直接或间接继承 QObject,2、类中有 Q_OBJECT 的声明

对于信号与槽的关联使用,可以分为以下三类

1、自动关联信号与槽

2、自定义信号与槽,手动关联(推荐使用)

3、F4 模式关联信号与槽

Qt 信号和槽

​​image​​

image

1、自动关联信号与槽

自动关联信号与槽通常是在窗口上面的控件使用的,右键点击窗口上面的控件,选择“转到槽”,选择对应的信号,那么就会自动生成与这个信号关联的槽函数。 这里的信号,其实就是函数,但是有区别于正常的 C++ 函数。 槽,就是一些列信号的选择界面。

image

然后选择信号选完信号点 OK 之后就会自动生成消息处理函数出来,指的就是说这个控件产生这个消息那么就会执行这个函数,我们就只需要在这个函数里面写上要执行的代码。

image

对于这信号是很有多的,我们对于这些信号不会特意去一个一个的讲过去,这些信号大家只需要通过帮助文档去看以下就好了,比如这里的按钮控件,首先在窗口右上角,可以看到这个按钮定义的类型是 QPushButton,然后再帮助文档里面查找。弄完就是下面这个样子。

image

在 contents 下面找 Signals,如果在当前类中找不到的就往父类去找。

Inherits:QAbstractButton 这个就是父类,点击它这里找到父类之后就可以看到 Signals,点击它。然后看以下解释就知道了是什么意思,下面 f 的这个 clicked 指的的就是当点击按钮的时候就会发出这个信号。

所以对于这个控件的信号我们就只需要知道他们会在什么情况下发送,想要处理这个信号就关联一个槽函数,就可以了。

对于自动关联信号与槽我们就只需要掌握好这个控件能够产生什么信号,在什么情况下产生,当需要对这个信号进行响应的时候就自动关联一个槽函数,在槽函数中写上要执行的代码的就可以了。

image这是帮助文档。

如果要删掉这个自动关联的信号与槽怎么办?

直接注释掉原函数。

如果想要重新生成一个,那就重复上面创建槽的步骤,注意不能和已有的同名。

2、自定义信号与槽,手动关联(推荐使用)

在设计界面拖动的所有组件,都可以看成有一个类型,定义了一个对象,那个对象把它创建出来的。这四步都是固定的,要掌握这四步。

信号与槽都是写在类中的:

类中信号实现

signals:           //必须写在signals下面
	void mySingnal();//只是一个函数声明,不需要实现

类中槽实现(看成类中的一个普通成员,所以函数声明和函数实现都要有):

private slots:   //必须写在slots下面,前面是三种访问属性的一种,
	void mySlot(){}   //槽是一个类中函数成员,需要声明和实现

关联信号与槽:

connect(this, //发送者 对象的地址
		SIGNAL(mySingnal()), //信号发送
		this,//接收者对象的地址
		SLOT(mySlot()) ); //槽(信号执行)
//上面的关联写在类中,是自己发信号自己的槽进行响应
//如果是要类外进行关联那么就需要QObject::connect使用

如此,都在 widget.cpp 文件里:

image

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>   //用来输出的功能类似cout
#include <QTime>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);


    connect(this,SIGNAL(mySignal1(char)),this,SLOT(mySlot1(char))); //关联信号与槽
    //connect(this,SIGNAL(mySignal1()),&mca,SLOT(myClassASlot2()));
    //信号的参为int类型,槽函数的参为char类型
    ui->pushButton->setCursor(QCursor(QPixmap(":/png/greenStone.png")));
    ui->timeEdit->setTime(QTime::currentTime());
}

Widget::~Widget()
{
    delete ui;
}

void Widget::mySlot1(char c)
{
    qDebug()<<"这个是我自定义的信号与槽"<<c;
}

//void Widget::on_pushButton_clicked()
//{
//    qDebug()<<"你点击了按钮";
//}

void Widget::on_pushButton_clicked()
{
//    qDebug()<<"点击了按钮";
    emit mySignal1('A');   //发送信号
}

//1、对于自动关联信号与槽需要思考的就是,说这个信号在什么情况下发出?这个信号发出了需不需要去执行一些代码?需要就转到槽
//在槽函数中写上要执行的代码,不需要就不管
//2、对于自定信号与槽,需要思考的就是,在关联的时候是那个对象发送什么信号,以及是那个对象来响应这个信号的槽函数。

自己创建新的类之后再添加信号和槽:

先是头文件:

#ifndef MYCLASSA_H
#define MYCLASSA_H
#include <QObject> //很明显,是继承自这个类

class MyClassA : public QObject
{
    Q_OBJECT
public:
    explicit MyClassA(QObject *parent = nullptr);

signals://从这里开始就是自定义的部分了
public slots:
    void myClassASlot2(); //自己创建的槽

};

#endif // MYCLASSA_H

然后是 CPP 文件

#include "myclassa.h"
#include <QDebug> //引用这个是为了能打印输出东西
MyClassA::MyClassA(QObject *parent) : QObject(parent)
{
}

void MyClassA::myClassASlot2()
{
    qDebug()<<"MyClassA::myClassASlot2()执行了";
}

在原本的 main.cpp 和 widget.h 文件里都要引用#include "myclassa.h"

还有 widget.cpp 里的调用新槽函数:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>   //用来输出的功能类似cout
#include <QTime>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    connect(this,SIGNAL(mySignal1(char)),this,SLOT(mySlot1(char))); //关联信号与槽
    //connect(this,SIGNAL(mySignal1()),&mca,SLOT(myClassASlot2()));
    //信号的参为int类型,槽函数的参为char类型
    ui->pushButton->setCursor(QCursor(QPixmap(":/png/greenStone.png")));//当我们的按钮在pushbutton的时候,鼠标的形状就变为这个图片的形状。
    ui->timeEdit->setTime(QTime::currentTime());//获取当前时间显示在窗口上
}
//上面的mca指的是新创建的MyClassA这个对象。创建在主文件main.cpp里。

Widget::~Widget()
{
    delete ui;
}

void Widget::mySlot1(char c)
{
    qDebug()<<"这个是我自定义的信号与槽"<<c;
}

image

最后注意 main.cpp 文件:

#include "widget.h"
#include <QApplication>
#include "myclassa.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    //MyClassA mca;  //这个新类的创建在其他文件里还要用到。
    //QObject::connect(&w,SIGNAL(mySignal1()),&mca,SLOT(myClassASlot2()));  //和上一行同时被注释。

    return a.exec();
}

需要注意:

1、如果槽函数带参,那么信号也要带一样的参,如果不一样的话就关联失败。

比如槽函数:mySlot(int); 信号:mySignal(char) 这两个不能通过上面的方式关联

2、槽函数不带参,信号带参可以关联

比如槽函数mySlot(); 信号:mySignal(char); 能关联,但是参数槽函数收不到

3、槽函数带参,信号也带参,信号参数多,并且和槽函数有的参一样可以关联

比如槽函数mySlot(int,char); 信号:mySignal(int,char,double) 能关联

这种方式所实现的信号与槽,自己都是很清楚谁关联的谁,信号,槽,参数是什么都一清二楚

F4 模式的信号与槽

在窗口上拖入一个按钮,然后按下 F4,就可以点击按钮然后拖出一个接地线一样的东西,这里点击的按钮拖出,那么指的就是点击的按钮发出的信号然后接地线拖到哪里就指得是那个来接收,比如由一个按钮点击拖出到另外一个按钮中,那么就是由点击得按钮发出信号另外一个按钮得槽来接收这个信号,当然这里信号与槽都是按钮自带的,所以使用起来不是很灵活,不建议使用。 F3 退出。

对于这种方式认识一下就可以了,知道怎么用就行

比如说,这样点击这个按钮就可以关闭窗口

image

窗口和资源

窗口

在创建窗口的时候有三个基类可以选择,表示三种基本的窗口

1、QWidget

2、QDialog

3、QMinWindow

QWidget:小部件窗口
通过show显示窗口,也可以用来做主要的窗口,或者用来自定义控件,子窗口,这类窗口上的小部件
QDialog:对话框
通过调用show()或者exec()显示窗口
show出来的是非模态窗口
exec的是模态窗口
QMinWindow:主窗口
通过show显示窗口
具有,菜单,通知栏,工具栏
菜单的使用可以直接再设计界面进行点击设置就可以了,如果你的窗口需要菜单,通知栏,工具栏这些就创建
QMinWindow为基类的窗口

对于这三种窗口,如果是弹出来的对话框就用 QDialog,是带有菜单这些的就用 QMinWidnow,只是一个

小窗口,或者是子窗口就用 QWidget

添加资源

右键项目==>添加新建项==> Qt Resource File==>输入资源文件的名字==> 添加前缀==>添加文件==> 保存就可以开始使用了

注意:

添加的资源文件,在编写代码的时候不能删除,否则出错,程序发布之后,资源文件不需要一起发送。(程序发布之后可以删去)

image

把前缀的 Prefix 的内容重新编辑下就能添加文件了。这个资源文件必须在英文目录下才能看见,注意 Ctrl+S 保存一下。

image

​​

文件路径:

相对路径:是从构建目录开始的​![image](https://b3logfile.com/file/2023/12/siyuan/1679928706511/assets/image-20231210173151-df6pz37.png)​

绝对路径:从根目录开始

资源的路径:右键资源,copy path那么这个就是资源的路径
用lable贴图:
pixmap属性可以直接修改要显示的图片
scaledContents可以修改图片是否允许缩放
QPushButton修改
icon属性可以在按钮里面的文字左边加一个小图片
右键按钮==>改变样式表==>添加资源下拉==>border-image==>可以将按钮的外观直接改为选中的图片资源
外观,使用还是正常的使用

复杂控件自定义

  • Qt
    11 引用 • 2 回帖

相关帖子

回帖
Qt

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...