QTmodel.zip

QT GUI编程_子羽丿的博客-CSDN博客这篇博客相当好,强推

bilibili html5 player

学习视频

qt下载安装

下面这个文档写的很详细

Qt安装包下载(Windows平台)_Alex-L的博客-CSDN博客

QT的下载与安装(QT5.9.1)_Qi_1337的博客-CSDN博客_qt 5.9.1安装及配置

qt学习

小知识

知识点速记

argc时命令行变量的数量,argv时命令行变量的数组

QApplication是应用程序对象,有且仅有一个

Widget w;窗口对象默认不会显示,必须调用show方法显示从窗口

return a.exec();让应用程序对象进入消息循环,让代码阻塞到此行

1
2
3
4
5
6
7
8
9
10
11
#include "widget.h"
#include <QApplication>

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

return a.exec();
}

常用函数

Qpushbutton的设置
getOpenFileName
static QString getOpenFileName(QWidget *parent = Q_NULLPTR,
                               const QString &caption = QString(),  
                               const QString &dir = QString(),  
                               const QString &filter = QString(),  
                               QString *selectedFilter = Q_NULLPTR,  
                               Options options = Options());
第一个参数parent,用于指定父组件。注意,很多Qt组件的构造函数都会有这么一个parent参数,并提供一个默认值0;
第二个参数caption,是对话框的标题;
第三个参数dir,是对话框显示时默认打开的目录,“.” 代表程序运行目录,“/” 代表当前盘符的根目录(Windows,Linux下/就是根目录了),也可以是平台相关的,比如“C:\”等;
第四个参数filter,是对话框的后缀名过滤器,比如我们使用“Image Files(.jpg .png)”就让它只能显示后缀名是jpg或者png的文件。如果需要使用多个过滤器,使用“;;”分割,比如“JPEG Files(.jpg);;PNG Files(.png)”;
第五个参数selectedFilter,是默认选择的过滤器;
第六个参数options,是对话框的一些参数设定,比如只显示文件夹等等,它的取值是enum QFileDialog::Option,每个选项可以使用 | 运算组合起来。

对象树

析构自下而上,构造自上而下。视频中的演示代码也是如此,只不过在寻找子类时会发生打印,但相应的类并没有进行析构

继承

C++中的继承_c++什么是继承_Amoricc的博客-CSDN博客

基类就是父类

派生类就是子类

子类是不会继承父类的构造函数和析构函数,父类没有默认构造函数,子类也不能有。

1
2
3
4
MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent)
{
qDebug() << "我的按钮类构造调用";
}

这个代码表示

2.2 public、protected、private 指定继承方式

不同的继承方式会影响基类成员在派生类中的访问权限

public继承方式

基类中所有 public 成员在派生类中为 public 属性;

基类中所有 protected 成员在派生类中为 protected 属性;

基类中所有 private 成员在派生类中不能使用。

protected继承方式

基类中的所有 public 成员在派生类中为 protected 属性;

基类中的所有 protected 成员在派生类中为 protected 属性;

基类中的所有 private 成员在派生类中不能使用。

private继承方式

基类中的所有 public 成员在派生类中均为 private 属性;

基类中的所有 protected 成员在派生类中均为 private 属性;

基类中的所有 private 成员在派生类中不能使用。

:和::的区别

C++中::和:的用法_小小土~的博客-CSDN博客_c++ :

::的作用

作用域,也就是该函数产生的位置,创建于什么类

  • 第一种,类作用域,用来标明类的变量、函数
1
Human::setName(char* name); 
  • 第二种,命名空间作用域,用来注明所使用的类、函数属于哪一个命名空间的
1
std::cout << "Hello World" << std::endl;

类MyPushButton继承于QPushButton,拥有QPushButton的所有public函数,并且添加了MyPushButton的构造函数MyPushButton和析构函数~MyPushButton

1
2
3
4
5
6
7
8
9
10
11
12
class MyPushButton : public QPushButton
{
Q_OBJECT
public:
explicit MyPushButton(QWidget *parent = 0);

~MyPushButton();

signals:

public slots:
};

如何实现两个窗口的连接

将两个控件进行连接

通过在主界面中加入同类型的容器,

能够实现的任务

此处为语雀卡片,点击链接查看

QT运行时的Debug、Release、Profile选项区别

其中Debug和Release我们都是耳熟能详的

前者是以-g模式编译 带着符号信息 便于我们调试

后者是经过优化之后 性能更上一个档次的

而根据官方说明,profile则是在这两种之中取一个平衡,兼顾性能和调试, 可以类似的看做是性能更优但是又方便调试的版本

QT运行时的Debug、Release、Profile选项区别_qt profile_顺其自然~的博客-CSDN博客

匿名对象QstringList()<<“yinxiong”<<“123”

QstringList()<<“yinxiong”<<“123”

创建匿名对象可以直接拼接字符串,省去起名的操作

qt程序创建

main

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include "mywidget.h"
#include <QApplication>// 包含一个应用程序类的头文件


//main程序入口 argc命令行变量的数量 argv命令行变量的数组
int main(int argc, char *argv[])
{
//a应用程序对象,在Qt中,应用程序对象 有且仅有一个
QApplication a(argc, argv);
//窗口对象 myWidget父类 -> QWidget
myWidget w;
//窗口对象 默认不会显示,必须要调用show方法显示窗口
w.show();

//让应用程序对象进入消息循环
//当代码阻塞到这行
return a.exec();
}

pro文本解释

一般来说,是不需要自己配置pro’文件的

1
2
3
4
5
6
7
8
9
10
11
12
13
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 //头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef MYWIDGET_H
#define MYWIDGET_H


#include <QWidget> //包含头文件 QWidget 窗口类

class myWidget : public QWidget
{
Q_OBJECT // Q_OBJECT宏,允许类中使用信号和槽的机制

public:
myWidget(QWidget *parent = 0); //构造函数
~myWidget(); //析构函数
};

#endif // MYWIDGET_H

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include "mywidget.h"
#include <QPushButton> //按钮控件的头文件
#include "mypushbutton.h"
#include <QDebug>

// 命名规范
// 类名 首字母大写,单词和单词之间首字母大写
// 函数名 变量名称 首字母小写,单词和单词之间首字母大写

//快捷键
//注释 ctrl + /
//运行 ctrl + r
//编译 ctrl + b
//字体缩放 ctrl + 鼠标滚轮
//查找 ctrl + f
//整行移动 ctrl + shift + ↑ 或者↓
//帮助文档 F1
//自动对齐 ctrl + i;
//同名之间的.h 和 .cpp切换 F4

//帮助文档 第一种方式 F1 第二种 左侧按钮 第三种 C:\Qt\Qt5.6.0\5.6\mingw49_32\bin

myWidget::myWidget(QWidget *parent)
: QWidget(parent)
{
//创建一个按钮
QPushButton * btn = new QPushButton;
//btn->show(); //show以顶层方式弹出窗口控件
//让btn对象 依赖在 myWidget窗口中
btn->setParent(this);

//显示文本
btn->setText("第一个按钮");


//创建第二个按钮 按照控件的大小创建窗口


//按钮可不可以 重新制定大小 可以!
btn2->resize(50,50);

//重置窗口大小
resize(600,400);

//设置固定窗口大小
setFixedSize(600,400);

//设置窗口标题
setWindowTitle("第一个窗口");





//创建一个自己的按钮对象
MyPushButton * myBtn = new MyPushButton;
myBtn->setText("我自己的按钮");

myBtn->move(200,0);
myBtn->setParent(this); //设置到对象树中



//需求 点击我的按钮 关闭窗口
//参数1 信号的发送者 参数2 发送的信号(函数的地址) 参数3 信号的接受者 参数4 处理的槽函数
//connect( myBtn, &MyPushButton::clicked, this, &myWidget::close );
connect( myBtn, &QPushButton::clicked, this, &QWidget::close );
}

myWidget::~myWidget()
{
qDebug() << "myWidget的析构调用";
}

Qt第一天笔记.docx

设置背景图片

Qt的主窗口背景设置-CSDN博客

打包qt程序

因为可能会将写好的程序发给别人,但是如果别人的电脑上没有配置过qt,他将无法运行我们所写的qt程序,所以为了程序的可移植性,我们要对已经编好的程序进行一个打包。

Qt程序移植_qt移植_叶落花枯的博客-CSDN博客

Qt错误:‘windeployqt’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。_windeployqt不是内部命令_JakeLinfly的博客-CSDN博客

qt之多线程

多线程的目的在于同时运行。比如说同时接受视频,以及文字信息。当只有一个线程时,一般不能同时进行(考虑了一下,如果对于视频和文字信息进行打包,再解包,可以实现一个线程同时传视频和传文字信息,不过比较麻烦,同时稳定性也不能保证),所以在这种场景下多线程的意义有所体现。

Qt多线程网络通信-[套接字通信 socket]_哔哩哔哩_bilibili

13、多线程_哔哩哔哩_bilibili

任选一个视频都可以对于qt多线程有一个大概的了解,并且进行简单的多线程编程

Qt 多线程基础及线程使用方式_qt多线程_富贵的编程日记的博客-CSDN博客

常用函数

Qt——常用控件详解_qt控件介绍_音视频开发老舅的博客-CSDN博客

QPushbutton

Qt QPushButton按钮用法详解

isflat
初始状态下,按钮是否显示边框。flat 属性的默认值为 flase,表示按钮带有边框。 该属性的值可以通过 isFlat() 方法获取,也可以通过 setFlat(bool) 方法修改。

QMessagebox

Qt QMessageBox用法详解_睿科知识云的博客-CSDN博客

disconnectFromHost

一、客户端断开连接,disconnectFromHost函数可以实现;服务器判断客户端有没有断开连接,可以看有没有连接的客户端有没有返回错误

QtcpSocket

winexc

这是一个线程函数,主要功能是启动一个可执行文件或 Python 程序。具体来说,它将 IP 地址转换为字符串类型,然后将其和可执行文件或 Python 程序的名称拼接成一个字符串。接着,使用 WinExec 函数或 system 函数来运行这个可执行文件或 Python 程序。

WinExec 是 Windows 系统下的一个函数,它可以执行一个命令行,并返回执行结果。它的第一个参数是要执行的命令行字符串,第二个参数是命令行的显示方式。这里的第二个参数为 0 表示不显示命令行窗口。

system 函数也可以执行一个命令行,并返回执行结果。它的第一个参数是要执行的命令行字符串。这里被注释掉了,可以选择使用 WinExec 函数或 system 函数。

接着,这个代码将字符串变量 str 转换为 char 型数组,因为 WinExec 函数和 system 函数都需要一个 char 型数组作为参数。最后,使用循环和 malloc 函数来分配内存,并将字符串复制到 char 型数组中。这样就可以将这个数组作为参数传递给 WinExec 函数或 system 函数了。

遇到的问题

无法运行qt

qt :-1: 错误:cannot open output file debug2.exe: Permission denied 类似错误_hicomadmin的博客-CSDN博客

qt .exe运行后界面不显示而在qtcreater中显示

问题原因:文件路径中有中文

Qt运行不出现界面_weixin_34236869的博客-CSDN博客

常见bug

缺少头文件

图片无法显示

这个有的电脑可以有的不可以,估计是版本问题的影响

方法一

路径设置中选择\可以显示,而/无法显示。

方法2

在图片上右键copy path

ui界面更改控件,但是代码中无法显示

Qt中ui文件新添加的控件在代码中不识别且运行项目界面上也没有该控件_ui.h没有相关控件_qt_初学者的博客-CSDN博客

按下某个按键之后ui界面闪退

错误示范

原因一般是因为内存泄漏,有变量没有进行初始化

QT的ui界面按钮点不了、不更新、无响应的可能原因_qt设计点不了_你洪哥的博客-CSDN博客

QT小记:QT程序异常结束的可能原因_吻等离子的博客-CSDN博客

QT程序异常结束问题分析_泱生的博客-CSDN博客

路径中别有中文

问题:编译不通过

原因:是路径中有中文,

解决办法:更改文件位置解决问题

问题:qt中.jpg文件无法显示

原因:是路径中有中文,

解决办法:更改文件位置解决问题

问题:在试图实现通信连接时报错,指监听的套接字不能和文件名同名

解决办法:将套接字名字修改成server1