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
#include
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,容器布局完后就无法往里面粘贴东西了
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函数打开失败,且不再创建该文件。