QT零碎笔记

文章目录


1,设定的名称和路径不能有空格,不能有中文。

2,QWidget是所有用户界面元素的基类,窗口和控件都是直接或间接继承自QWdiget。

3,若改变.pro中生成的.exe程序的名称,点击运行后就会从新生成一个.exe文件,但是源文件不会被删除。

4,防止头文件重复包含,即重复编译

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
......
#endif // MAINWINDOW_H

5,::作用域 :继承
6,若在头文件中定义了 QPushButton btn,这再源文件中可以直接使用且无需考虑析构因为他是放在栈上的,函数执行完后自动释放,但是定义了QPushButton *btn;就要先申请空间再使用且先要把他放在对象树上,再使用。
7,

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

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

8,命名规范
1,类名:首字母大写,单词和单词之间首字母大写
2,函数名和变量名:首字母小写,单词和单词之间首字母大写
9,快捷键
1,注释:ctrl+/
2,运行:ctrl+r
3,编译:ctrl+b
4,字体缩放:ctrl+鼠标滚轮
5,查找功能:ctrl+f
6,自动对齐ctrl+i
7,同名之间的.h和cpp切换F4
10,

Person(string name,string pName):m_Name(name),m_phone(pName)
其中m_Name和m_pNmae是类内定义的变量

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent)
其中QWidget*和上面的string一样只是一个变量类型

11,再Qt中创建好变量后就立马加入到对象树中
12,每次创建好项目的时候就立马运行一下,看是否创建正确
13,

//触发关键字emit
emit zt->hungry();

14,

//信号槽----解决槽函数发生重载的问题
//有参
void(Techaer*Tea)(QString)=&Teacher::hungry;
//无参
void(Techaer*Tea)(void)=&Teacher::hungry;

15,

//QString转为char*
foodName.toUtf8().data();
QByteArray toUtf8()const
char* data()

16,
1,信号可以连接信号
2,一个信号可以连接多个槽函数,但是槽函数的执行顺序是随机的
3,多个信号可以连接一个槽函数
4,信号和槽函数的参数必须一一对应,信号的参数个数可以多于槽函数的参数个数,如果不对应但是还想用,就用Lambda表达式
5;

//最后有()是调用,没有只是连接
[=](){
btn->setText("aaa")
}();

17,

//为什么创建的第二个窗口会自动析构
QWidget *secondWidget=new QWidget;
secnodWidget->show();

18,
添加资源文件:
1,在Explorer中显示(MyWidget主窗口源文件) 加入资源文件
2,QT Resource File
3,Open in Editor (打开资源文件进行编辑)
4,资源":+前缀名+文件名“ ”:/ Image"
19,

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include <QDebug>

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


    //点击新建按钮 弹出一个对话框
    connect(ui->actionnew,&QAction::triggered,[=](){
        //对话框 分类
        //模态对话框(不可以对其他窗口进行操作) 非模态对话框(可以对其他窗口进行操作)
        //1.模态创建 阻塞
//        QDialog dlg(this);放在对象树上函数执行完后对象就不存在了,即点击小叉子就不在了,没触发一次就会创建一次。
//       dlg.resize(200,100);//窗口太小会发出警告
//        dlg.exec();阻塞功能当点击小叉子才能执行下面程序
//        qDebug()<<"模态对话框弹出了";

        //2.非模态对话框
        /*
        2.1、为了窗口不会一闪而过,要创建在堆区
        2.2、因为放在对象树中,只有整体窗口关闭,才会释放,如果一直点会堆区内存泄漏
        */
        QDialog * dlg2 = new QDialog(this);
        dlg2->resize(300,200);
        dlg2->show();
        //为了不内存泄漏
        dlg2->setAttribute(Qt::WA_DeleteOnClose); //55号属性
        qDebug()<<"非模态对话框弹出了";
    });
}

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

20,
QMessageBox静态成员函数 创建对话框

//错误对话框
QMessageBox::critical(this,"critical","错误");

//信息对话框
QMessageBox::information(this,"info","信息");

//提问对话框
//参数1 父亲、 参数2 标题 、参数3 提示内容 、参数4 按键类型、 参数5 默认关联回车按键
QMessageBox::question(this,"quess","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel);
//根据返回值做判断
if(QMessageBox::Save==QMessageBox::question(this,"quess","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel))
{
    qDebug()<<"选择的是保存";
}
else
{
    qDebug()<<"选择的是取消";
}

//警告对话框
QMessageBox::warning(this,"warning","警告");


//颜色对话框
QColor color= QColorDialog::getColor(QColor(255,0,0));
qDebug()<<"r = "<<color.green()<<"b = "<<color.blue();

//文件对话框 参数1 父亲 参数2 标题 参数3 默认打开路径 参数4 过滤文件格式
//返回值是选取的路径
QString str = QFileDialog::getOpenFileName(this,"打开文件","C:/Users/lenovo/Desktop","(*.txt)");
qDebug()<<str;

//字体对话框
bool flag;
QFont font = QFontDialog::getFont(&flag,QFont("华文彩云",36));
qDebug()<<"字体:"<<font.family().toUtf8().data()<<"字号:"<<font.pointSize()<<"是否加粗:"<<font.bold()<<"是否倾斜:"<<font.italic();

21,QString QStringList QList《QString》

//这里的1,2只代表第几个,就算调换位置结果依然不变
1,QString str=QString(x=%1 y=%2).arg(ev->x()).arg(ev->y());
	2,QString list;
		list<<"孙悟空"<<"猪八戒";这两个名字独立成行
	3,QList《QString》等价于QStringList
		QList《QString》list;
		list<<"孙悟空"<<"猪八戒";

22,QLabel:
frameshape可以调整图形框架

23,静态类型转换
QMouseEvent*ev=static_cast《QMouseEvent》

24,事件
如果是一个很明确的事件拦截后,用户自己处理这个事件,不向下分发,如果从众多事件中选出一个自己处理,那么最后还要把未处理的事件交给父类处理return QLabel::event(e)

25,所有事件重写,注意在声明的时候小括号中的参数一定要补全

26,TCP 服务端
1,在server.h中,创建两个公共成员listen(QTcpServer型)和conn(QTcpSocke型)
2,在server.cpp中,先指定好默认端口和地址,然后创建监听套接字,并放在对象树中,将套接字设置为监听模式。
3,可以通过QTcpServer提供的void newConnection()信号来检测是否有连接需求,如果有在对应的槽函数中调用nextPendingConnection(),函数获取到客服端socket信息(返回值为QTcpSocket*类型指针),通过此套接字与客户端进行通信。
4,在有对象时,由readRead()监听是否有信息传入,若有用readAll()读取所有数据。
5,有对象时,使用write函数发送数据

27,TCP 客户端
1,在client.h中创建一个成员client(QTcpSocket型)
2,在client.cpp中,创建默认地址和端口,创建套接字
3,向客户端发出数据write()
4,客户端接收数据:若有消息传入,会触发信号readRead,则用readAll()读取数据。

28,UDP服务端
1,获取客户端的IP和端口
2,创建套接字
3,若想接收数据则绑定自身端口
4,readyRead监听是否有信号传入,若有则用readDatagram读取数据
5,用writeDategram发送数据

29,多线程使用方式1
1,需要创建一个线程类的子类,让其继承QT中的线程类QThread
2,重写父类中的run(),函数体中写入要做的业务
3,在主线程中创建子线程,new就可以了
4,启动线程用,调用start方法

30,多线程使用方式2
1,创建一个类,让这个类由QObject派生
2,在这个类中可添加n个执行不同业务的公共成员函数
void working();
3,在主线程中创建n个QThread对象,
QThread*sub=new QThread;

31,
1,设计模式:设计窗口
2,Debug:调试的时候自动切到Debug模式下
3,顶层窗口:页面最前面的窗口

32,所有控件都可以看作是一个窗口,都是由Qwidget派生的,

33,应用程序类QApplication:当窗口执行时候,应用程序类就会进入消息循环,每触发一个事件就会捕捉窗口事件,然后做一个默认处理

34,f1转到官方提供文档,f2转到自定义函数

35,信号槽的四个参数都为地址

36,主窗口可以访问窗口中的内容,并可以改变其属性

37,槽函数可以是任意类的成员函数,全局函数,Lambda表达式(隐式函数:隐式函数是没有名字的函数),槽函数也可以当作普通函数使用

38,槽函数需要与信号对应(返回值,参数)因为信号没有返回值,则槽函数返回值为void;在自定义槽信号的时候尽量在函数名上加上Slot和Signal增强代码可读性。

39,一般的成员变量定义为private下方,成员函数定义在public下方

40,头文件不可以递归包含,即(你包含我的头文件,我包含你的头文件)

41,应用程序输出->stop Running Program

42,一般槽函数不复杂用Lambda表达式,若复杂则定义槽函数,使构造函数代码量减少,思路清晰。

43,点击第二个窗口的按钮close,就关闭主窗口

	//信号连接信号  参数要对应
	connect(第二个窗口,点击close,第二个窗口,关闭主窗口)
	//信号连接槽	参数要对应
	connect(第二个窗口,关闭主窗口,主窗口,关闭窗口)

44,QByteArray QT中的字节数组,每个字节数组都是Utf8类型

45,控件在移动位置的时候,若是超出了窗口的大小,则不显示在窗口上,但是是存在的,

46,在.pro中不要写注释,防止乱码

47,在用F1查看帮助文档的时候,要在函数中随意放一个参数,例如resize(1);

48,用槽信号的时候,注意信号的标志,和槽函数的标志

49,资源文件可以加入不同文件夹,

50,栅格布局:特点是每一列的宽度是相等的

51,弹簧可以当作是棒子使用,只要把他的长度设为固定值。

52,在QT中QPixmap就是一个图片,QPicture不是

53,QPushButton::pressed() QPushButton::clicked
QPushButton::released()

54,要在label中添加图片,只有布局后才能把图片显示全

55,Label只能播放gif类型的动图

56,布局会把按钮调制为原有大小,就算之前设置大小也无用,应先布局再调整大小(minimunsize maxmumsize)

57,ui只适合去修改某些控件的属性和整体的布局,一般信号槽不在ui中添加,因为不好找错误。

58,标准消息对话框,都是模态对话框

59,容器布局完后就无法往里面粘贴东西了

60,选中容器可以取消之前类的提升,
在这里插入图片描述

61,
Qt 中QString 字符串操作:连接、组合、替换、去掉空白字符
Qt中的字符串类 QString类 保存了16位Unicode值,提供了丰富的操作、查询和转换等函数。

QString 字符串有如下几个操作符:

(1) “+” 用于组合两个字符串,“+=” 用于将一个字符串追加到另一个字符串的末尾,例如:

1 QString str1 = "Welcome";
2 str1 = str1 + "to you !";   //str1 = "Welcome to you!"
3 QString str2 = "Hello,";
4 str2 += "World!";      //str2 = "Hello,World!"

(2)QString::append()函数,具有与“+=”操作符同样的功能,实现字符串末尾追加另一个字符串,例如:

1 QString str1 = "Welcome ";
2 QString str2 = "to ";
3 
4 str1.append(str2);             //str1 = "Welcome to "
5 str1.append("you !");         //str1 = "Welcome to you !"

(3)组合字符串的另一个函数是QString::sprintf(),此函数支持的格式定义和C++库中的函数sprintf()定义一样,例如:

1 QString str;
2 str.sprintf("%s","Welcome ");     //str = "Welcome "
3 str.sprintf("%s"," to you! ");      //str = " to you! "
4 str.sprintf("%s %s","Welcome "," to you! ");     //str = "Welcome  to you! ";

(4)Qt还提供了另一种方便的字符串组合方式,使用QString::arg()函数,此函数的重载可以处理很多的数据类型。此外,一些重载具有额外的参数对字段的宽度、数字基数或者浮点精度进行控制。相对于QString::sprintf(),QString::arg()是一个比较好的解决方案,因为它类型安全,完全支持Unicode,并且允许改变“/n”参数的顺序。例如:

1 QString str;
2 str = QString("%1 was born in %2.").arg("Joy").arg(1993);     //str =  "Joy was born in 1993.";

其中:

“%1” 被替换为“Joy”.

"%2"被替换为“1993”.

(5)QString 也提供了一些其他的组合字符串的方法,包括以下几种:

a. insert()函数:在原字符串特定位置插入另一个字符

b. prepend()函数:在原字符串开头插入另一个字符串

c. replace()函数:用指定的字符串去代替原字符串中的某些字符

(6)去除字符串两端的空白(空白字符包括回车符号“\n”、换行符“\r”、制表符"\t"和空格字符:“ ”等)非常常用,如获取用户输入账号时就需要去掉空白符。

a. QString::trimmed()函数:移除字符串两端的空白符

b. QString::simplified()函数:移除字符串两端的空白字符,使用单个空格字符“ ”代替字符串中出现的空白字符。

例如:

1 QString str1 = "   Welcome  \t  to  \n  you!   ";
2 QString str2 = "   Welcome  \t  to  \n  you!   ";
3 str1 = str1.trimmed();      // str1 = " Welcome \t to \n you! "
4 str2 = str2.simplified();     // str2 = " Welcome to you ! "

62,回调函数:此函数不需要用户调用,当某个对象触发后,自动调用

63,如果想使用画家类在窗口中画图,操作必须在paintEvent中完成

64,QPixmap 图片类,主要用于显示,针对显示器做了优化,依赖于平台(主要用于主窗口,UI的显示,传输可能会导致他的格式改变)

65,QImage 图片类,不依赖平台(主要用于图片传输,因为其格式不会改变,可以在多线程中对他操作,例如百度地图(实时更新))

66,在QPicture中画图,保存的不是图片,是二进制文件(save保存生成的文件),不依赖于平台。

67,受保护的函数一般重写的时候,写在public下面

68,QRect:整数矩形 QRectF:浮点数矩形

69,QIODevice::Append 使用时自动把指针移向文件尾部,进行文本添加,如果紧接着使用QIODevice::ReadWrite去读取文件,则文件是读不出来的,因为指针已经移动到文件尾部了。

70,
当使用QFile打开指定文件的时候:

1、文件名中不包含路径(“test.txt”),若文件存在则打开成功,若文件不存在则创建该文件,open返回值均为true。

2、文件命中包含路径:

a、若该路径已经存在,则open函数打开或创建指定文件。

b、若路径不存在,则open函数打开失败,且不再创建该文件。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值