Qt入门基础知识(vs2017+Qt5.12)
声明:参考(最新QT从入门到实战完整版|传智教育_哔哩哔哩_bilibili) 做的笔记。
#pragma execution_character_set("utf-8")//防止中文乱码
目录
1、命名规范
2、快捷键
3、QPushButton
4、坐标轴
5、信号与槽
6、QMainWidget
7、资源文件添加
8、对话框
9、页面布局
10、控件
11、Qt中的鼠标事件
12、QPainter绘图
13、文件相关操作
1、命名规范:
类名:首字母大写,单词与单词之间首字母大写;
函数名、变量名称:首字母小写,后面单词与单词的首字母大写。
2、快捷键:
注释:ctrl+/
运行:ctrl+r
编译:ctrl+b
字体缩放:ctrl+鼠标滚轮
查找:ctrl+f
整行调整:ctrl+shift+(向上箭头或向下箭头)
帮助:F1
自动对齐:ctrl+i
同名之间的.h和.cpp切换:F4
3、QPushButton
//myWidget.cpp//创建一个按钮
QPushButton * btn = new QPushButton;
//以顶层方式弹出窗口弹出
btn->show();
//让btn对象,依赖在myWidget窗口中
btn->setParent(this);
//显示文本
btn->setText("第一个按钮");
//创建第二个按钮,按照控件的大小创建窗口
QPushButton* btn2 = new QPushButton("第二个按钮",this);
//移动按钮
btn2->move(100, 100);
4、坐标轴:
以左上方为原点(0,0),x向右增加,Y向下增加。
5、信号与槽:
5.1 系统自带的信号与槽:CSDNhttps://mp.csdn.net/mp_blog/creation/editor/121880044
5.2自定义信号与槽:
以“老师饿了,学生请客”为例
信号发送者:老师 , 发送的信号:饿了 , 信号接收者:学生 ,槽函数:请客吃饭teach
teacher.h
signals://自定义信号,写到signal下面//返回值是void,只需要声明,不需要实现//可以有参数,可以重载void hungry();
student.h
public:Student(QWidget *parent = nullptr);~Student();//槽函数写在public下面即可,//返回值void ,需要声明,也需要实现//可以有参数,可以发生重载void treat();
student.cpp
void Student::treat()
{qDebug() << "请老师吃饭";
}
_SignalAndSlot.h
teacher* zt;
Student* st;
_SignalAndSlot.cpp
//创建一个老师对象
this->zt = new teacher(this);
//创建一个学生
this->st = new Student(this);
//老师饿了,学生请客;
connect(zt, &teacher::hungry, st, &Student::treat);
//断开信号
disconnect(zt, &teacher::hungry, st, &Student::treat);
信号与槽的重载:
函数指针可以指向函数地址,因为信号和槽发生重载,需要定义函数指针
/连接带参数的信号与槽
//指针->地址
//函数指针->函数地址
void (teacher::*Shungry)(QString FoodName)= &teacher::hungry;
void (Student::*Streat)(QString FoodName)= &Student::treat;
connect(zt, Shungry, st, Streat);
emit zt->hungry("鱼香肉丝");
5.3拓展:
(1).信号可以连接信号
(2).一个信号连接多个槽函数
(3).多个信号可以连接同一个槽函数
(4).信号和槽的参数类型必须一一对应
(5).信号的参数个数可以多于槽的参数个数
5.4 Lambda表达式
Lambda表达式用于创建匿名函数对象,以简化编程工作。
基本构成:
[capture](parameters)mutable->return-type
{
statement
}
//[函数对象参数](操作符重载函数参数)mutable->返回值(函数体)
(1)函数对象参数:[],标识一个Lambda的开始,必须存在。
函数对象参数形式:
1)空:没有使用任何函数对象参数。
2)=:函数体内可以使用Lambda所在范围内所有可见的局部变量(包括this),是值传递的方式。
例:
[=]() {btn->setText("aaa");}();
3)&:函数体内可以使用Lambda所在范围内所有可见的局部变量(包括this),是引用传递的方式。
4)this:函数体内可以使用Lambda所在类中的成员变量。
5) a:将a按值进行传递。
6) &a:将a按引用方式进行传递。
7) a,&b:将a按值进行传递,b按引用方式进行传递。
8)=,&a,&b:除a和b按引用进行传递,其他参数都按值进行传递。
注意:一般使用“=”,不会出错。
(2)操作符重载函数参数:
标识重载的()操作符的参数,没有参数时,这部分可以省略。
(3)可修改标示符;
mutable声明,这部分可以省略。按值传递函数对象参数时,加上mutable修饰符后,可以修改按值传递进来的拷贝。
(4)函数返回值:
->返回值类型,标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方时,这部分可以省略。
int ret = []()->int {return 1000; }();
//利用Lambda表达式点击按钮,关闭窗口QPushButton* btn3 = new QPushButton;btn3->setText("关闭");btn3->setParent(this);connect(btn3, &QPushButton::clicked, this, [=](){this->close();});
注意:
如果connect()的参数中,第三个是this,第四个是Lambda表达式,第三个“this”可以省略。
Lambda表达式最常用:[=](){};
6、QMainWindow
QMainWindow是一个为用户提供窗口程序的类型,包含菜单栏(menu bar)、工具栏(tool bas)、 锚接部件(dock widgets)、状态栏(status bar)、中心部件(central widget)。
6.1 菜单栏
//菜单栏最多有一个//菜单栏创建QMenuBar * bar = menuBar();//将菜单放到窗口中setMenuBar(bar);//创建菜单QMenu* fileMenu=bar->addMenu("文件");QMenu* editMenu = bar->addMenu("编辑");//创建菜单项fileMenu->addAction("新建");//添加分隔线fileMenu->addSeparator();fileMenu->addAction("打开");
6.2工具栏
//工具栏 可以有多个QToolBar* toolBar = new QToolBar(this);//addToolBar(停靠区域(枚举值), toolBar);addToolBar(Qt::LeftToolBarArea, toolBar);//设置设置,只允许,左右停靠toolBar->setAllowedAreas(Qt::LeftToolBarArea | Qt::RightToolBarArea);//设置浮动toolBar->setFloatable(false);//设置移动(总开关)toolBar->setMovable(false);//工具栏中设置内容QAction * newAction = fileMenu->addAction("新建");QAction * openAction = fileMenu->addAction("打开");toolBar->addAction(newAction);//添加分割线toolBar->addSeparator();toolBar->addAction(openAction);//工具栏中添加控件QPushButton* btn = new QPushButton("关闭", this);toolBar->addWidget(btn);
6.3状态栏
//状态栏 最多一个QStatusBar* staBar = statusBar();//设置到窗口中setStatusBar(staBar);//放置标签控件QLabel * label = new QLabel("提示信息",this);staBar->addWidget(label);QLabel * label2 = new QLabel("右侧提示信息", this);staBar->addPermanentWidget(label2);
6.4铆接部件和中心部件
//铆接部件(浮动窗口) 可以有多个(浮动窗口围绕核心部件)QDockWidget* dockWidget = new QDockWidget("浮动",this);addDockWidget(Qt::BottomDockWidgetArea, dockWidget);//设置后期停靠区域,只允许上下dockWidget->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);//设置中心部件 只能一个QTextEdit * edit = new QTextEdit(this);setCentralWidget(edit);
注意:只有一个的用setxxx,有多个的用addxxx。
7、资源文件添加
先添加“add prefix”,再添加“add file”
//添加Qt资源ui.actionnew->setIcon(QIcon("xxxx"));
8、对话框
8.1 对话框分类
(1)模态对话框(不可以对其他窗口进行操作)
(2)非模态对话框(可以对其他窗口进行操作)
8.1.1 模态对话框
QDialog dig(this);
//更改对话框大小,太小会报警告
dig.resize(400, 100);
dig.exec();
qDebug() << "模态对话框弹出来";
8.1.2 非模态对话框
//防止一闪而过,创建堆区QDialog *dig=new QDialog(this);//当点击关闭的时候,释放对象dig->setAttribute(Qt::WA_DeleteOnClose);//属性 55dig->resize(400, 100);dig->show();
8.2 标准对话框
内置对话框大致分为以下几类:
QColorDialog:选择颜色
QFileDialog:选择文件或者目录
QFontDialog:选择字体
QInputDialog:允许用户输入一个值,并将其值返回
QMessageBox:模态对话框,用于显示信息、询问等信息
QPageSetupDialog:为打印机提供纸张相关的选项
QPrintDialog:打印机配置
以消息对话框为例:
//错误对话框
QMessageBox::critical(this, "critical", "错误");
//信息对话框
QMessageBox::information(this, "info", "信息");
//问题对话框
QMessageBox::question(this, "ques", "提问");
QMessageBox::question(this, "ques", "提问",QMessageBox::Save| QMessageBox::Cancel, QMessageBox::Cancel);
//进行if判断接收
if (QMessageBox::Save == QMessageBox::question(this, "ques", "提问", QMessageBox::Save | QMessageBox::Cancel, QMessageBox::Cancel)){qDebug() << "选择的是保存";}
文件对话框
//文件对话框 参数1:父亲,参数2:标题,参数3:默认打开路径,参数4:过滤文件格式
//返回值是:选取路径
QString str=QFileDialog::getOpenFileName(this,"打开文件","H:\\QT_test\\studay_test\\05_QDialog","(*.exe)");
字体对话框
bool flag;
QFont font=QFontDialog::getFont(&flag, QFont("华文彩云",36));
qDebug() << "字体:" << font.family().toUtf8().data() << "字号" << font.pointSize() << "是否加粗" << font.bold() << "是否倾斜" << font.italic();
9、页面布局(登录界面)
(1)、选取widget进行布局(水平布局、垂直布局、栅格布局),
(2)、给用户名、密码、登录、退出按钮进行布局
(3)、默认窗口和控件之间有9间隙,可以调整layoutLeftMargin
(4)、利用弹簧进行布局
10、控件
10.1 按钮组件(系统中的控件)
采用Qt Designer构建单选框
//设置单选按钮 男默认选中ui.rBtnMen->setChecked(true);//选中女后,打印信息connect(ui.rBtnWomen, &QRadioButton::clicked, [=](){qDebug() << "选中了女";});
10.2 QListWidget控件(系统中的控件)
//利用listWidget写诗QListWidgetItem * item = new QListWidgetItem("举头邀明月");//将一行诗放到listWidget中ui.listWidget->addItem(item);//设置居中item->setTextAlignment(Qt::AlignHCenter);//一次性将内容放到listWidget中//QStringList Qlist<QString>QStringList list;list << "窗前明月光" << "疑似地上霜" << "举头邀明月" << "对影成三人";ui.listWidget->addItems(list);
10.3 QTreeWidget控件(系统中的控件)
//treeWidget树控件使用//设置水平头//匿名对象(QStringList() << "英雄" << "影响简介");ui.treeWidget->setHeaderLabels(QStringList() << "英雄" << "英雄简介");QTreeWidgetItem* liItem = new QTreeWidgetItem(QStringList() << "力量");QTreeWidgetItem* minItem = new QTreeWidgetItem(QStringList() << "敏捷");QTreeWidgetItem* zhiItem = new QTreeWidgetItem(QStringList() << "智力");//加载顶层节点ui.treeWidget->addTopLevelItem(liItem);ui.treeWidget->addTopLevelItem(minItem);ui.treeWidget->addTopLevelItem(zhiItem);//追加子节点QStringList heroL1;heroL1 << "刚被猪" << "前排坦克****";QTreeWidgetItem* l1 = new QTreeWidgetItem(heroL1);liItem->addChild(l1);
10.4 自定义控件封装
(1)首先重新添加一个Widget类,在新添加的.ui界面中选择控件进行组合。
(2) 在最初的.ui文件中,添加Widget控件。右键“Widget”控件->提升为...->
输入(1)中添加的类名,勾选“全局包含”->添加->提升(添加的控件改为类名)
注意:如果出现下错误:
解决方案:
将.h文件添加在uic文件夹中
11、Qt中的鼠标事件
工程项目右键->添加->新建项->Qt Class(对文件信息进行相应修改,Base class:QObject(默认不变),ClassName:myLabel)
以QLabel为例:
.ui文件中添加QLabel控件,右键-》提升为-》(对myLabel类进行提升)
myLabel.h
修改基类为QLabel,构造函数的参数类型为QWidget。
#include <QLabel>class myLable : public QLabel
{Q_OBJECTpublic:myLable(QWidget *parent);~myLable();//鼠标进入事件void enterEvent(QEvent *event);//鼠标离开事件void leaveEvent(QEvent *event);//鼠标按下virtual void mousePressEvent(QMouseEvent* ev);//鼠标释放virtual void mouseReleaseEvent(QMouseEvent* ev);//鼠标移动virtual void mouseMoveEvent(QMouseEvent* ev);
};
myLabel.cpp
#include "myLable.h"
#include<qdebug.h>
myLable::myLable(QWidget *parent): QLabel(parent)
{//设置鼠标追踪状态setMouseTracking(true);
}myLable::~myLable()
{}
void myLable::enterEvent(QEvent *event)
{qDebug() << "鼠标进入了";
}
//鼠标离开事件
void myLable::leaveEvent(QEvent *event)
{qDebug()<< "鼠标离开了";
}
//鼠标按下
void myLable::mousePressEvent(QMouseEvent* ev)
{if(ev->button()==Qt::LeftButton){//用%1,%2等代替变量类型QString str = QString("鼠标按下了 x=%1 y=%2").arg(ev->x()).arg(ev->y());qDebug() <<str;}
}
//鼠标释放
void myLable::mouseReleaseEvent(QMouseEvent* ev)
{qDebug() << "鼠标释放了";
}
//鼠标移动(状态)
void myLable::mouseMoveEvent(QMouseEvent* ev)
{if(ev->buttons()& Qt::LeftButton){QString str = QString("鼠标移动了 x=%1 y=%2").arg(ev->x()).arg(ev->y());qDebug() <<str;}
}
12、QPainter绘图
12.1 基础设置
11_QPainter.h
//绘图事件void paintEvent(QPaintEvent* );
11_QPainter.cpp
#include "_QPainter.h"
#include<qpainter.h>//画家类
#pragma execution_character_set("utf-8")
_QPainter::_QPainter(QWidget *parent): QWidget(parent)
{ui.setupUi(this);
}
void _QPainter::paintEvent(QPaintEvent* )
{//实例化画家对象 this指定的是绘图设备QPainter* painter=new QPainter(this);//设置画笔QPen pen(QColor(255, 0, 0));//设置笔宽pen.setWidth(2);//设置画笔风格pen.setStyle(Qt::DotLine);painter->setPen(pen);//设置画刷QBrush brush(Qt::cyan);//设置画刷风格brush.setStyle(Qt::Dense7Pattern);//让画家使用画刷painter->setBrush(brush);//画线painter->drawLine(QPoint(0, 0), QPoint(100, 100));//画圆、椭圆(圆点,rx,ry)painter->drawEllipse(QPoint(100, 100), 50, 50);//画矩形(左,上,宽,高)painter->drawRect(QRect(50, 50, 30, 30));//画文字painter->drawText(QRect(10, 100, 200, 30), "好好学习,天天向上");
}_QPainter::~_QPainter()
{}
12.2 高级设置
/高级设置///QPainter painter(this);painter.drawEllipse(QPoint(100, 100), 50, 50);//设置 抗锯齿能力 效率低(画圆)painter.setRenderHint(QPainter::Antialiasing);painter.drawEllipse(QPoint(200, 100), 50, 50);//画矩形(左,上,宽,高)painter.drawRect(QRect(50, 50, 30, 30));//移动画家painter.translate(100, 0);//保存画家状态painter.save();painter.drawRect(QRect(50, 50, 30, 30));painter.translate(100, 0);//还愿画家状态painter.restore();painter.drawRect(QRect(50, 50, 30, 30));
12.3 手动调用绘图事件
posX为定义的成员变量
///利用画家 画资源图片/QPainter painter(this);posX += 20;painter.drawPixmap(posX,20,QPixmap(":/Image/TuPian.jpg"));
//点击移动按钮,移动图片connect(ui.Btn, &QPushButton::clicked, [=]() {update();});
12.4 绘图设备
图系统基于QPainter、QPainterDevice和 QPaintEngine三个类。
绘图设备是指继承QPainterDevice的子类。
(1)QPixmap:专门为图像在屏幕上的显示做了优化
(2)QBitmap是QPixmap的一个子类,它的色深限度为1。(黑白图)
(3)QImage专门为图像的像素级访问做了优化。
(4)QPicture则可以记录和重现QPainter的各条命令。
12.4.1 QPixmap
//Pixmap绘图设备QPixmap pix(300, 300);//填充颜色pix.fill(Qt::white);//声明画家 QPainter painter(&pix);painter.setPen(QPen(Qt::green));painter.drawEllipse(QPoint(150, 150), 20, 20);//保存(将图片保存在此位置)pix.save("H:\\QT_test\\studay_test\\12_QPaintDevice\\1.PNG");
12.4.2 QImage(与QPixmap操作相似)
void _QPaintDevice::paintEvent(QPaintEvent *)
{QPainter painter(this);//利用QImage对像素进行修改QImage img;img.load(":/Image/TuPian.jpg");//修改像素点for (int i = 50; i < 100; i++){for (int j = 50; j < 100; j++){QRgb value = qRgb(255, 0, 0);img.setPixel(i, j, value);}}painter.drawImage(0, 0, img);
}
12.4.3 QPicture
//QPicture 绘图设备QPicture pic;QPainter painter;painter.begin(&pic);//开始往pic上画painter.setPen(QPen(Qt::cyan));painter.drawEllipse(QPoint(150, 150), 20, 20);painter.end();//结束画画//保存到磁盘pic.save("H:\\QT_test\\studay_test\\12_QPaintDevice\\4.zt");
void _QPaintDevice::paintEvent(QPaintEvent *)
{//重现QPicture的绘图指令QPicture pic;QPainter painter(this);pic.load("H:\\QT_test\\studay_test\\12_QPaintDevice\\4.zt");painter.drawPicture(0, 0, pic);
}
13 文件相关操作
13.1 QFile控件对文件进行读写
在ui中添加lineEdit、pushButton、textEdit三个控件,通过代码对文件进行读写操作。
connect(ui.pushButton, &QPushButton::clicked, [=]() {QString path=QFileDialog::getOpenFileName(this, "打开文件", "H:\QT_test\studay_test\13_QFile");ui.lineEdit->setText(path);//读取内容 放到textEdit中//QFile默认支持的格式是utf-8QFile file(path);//参数就是读取文件的路径//设置打开方式file.open(QIODevice::ReadOnly);QByteArray array = file.readAll();//将文件中的内容全部放在array中//读取内容 放到textEdit中//QFile默认支持的格式是utf-8QFile file(path);//参数就是读取文件的路径//设置打开方式file.open(QIODevice::ReadOnly);//QByteArray array = file.readAll();//将文件中的内容全部放在array中//将读取的数据 放入textEdit中ui.textEdit->setText(array);//编码格式类QTextCodec* codec = QTextCodec::codecForName("gbk");ui.textEdit->setText(codec->toUnicode(array));QByteArray array;while (!file.atEnd()){array += file.readLine();//按行读}ui.textEdit->setText(array);//对文件对象进行关闭file.close();//进行写文件file.open(QIODevice::Append);//用追加方式进行写file.write("xxx");file.close();});
13.2 QFileInfo文件信息读取(对读取文件的信息进行打印)
//QFileInfo 文件信息类
QFileInfo info(path);
qDebug() << "大小:" << info.size() << "后缀名:" << info.suffix() << "文件名称:" << info.fileName();
qDebug() << "创建日期:" << info.created().toString("yyyy/MM/dd hh:mm:ss");//头文件:QDateTime
qDebug() << "最后修改日期:" << info.lastModified().toString("yyyy/MM/dd hh:mm:ss");
});
Qt入门基础知识(vs2017+Qt5.12)相关推荐
- python笔记基础-Python入门基础知识学习笔记之一
为什么要写这篇文章? 本人做过Objective-C开发,现在在用C#做WinForm开发.近段时间在学习Python入门基础知识时,发现有很多知识点和Objective-C的不一样.故想通过本文记录 ...
- C++ VS2017 QT5.12开发在xp环境下运行 [2019]亲测推荐
项目是C++在vs2017+QT5.12写的,在win7,win8,win10运行无任何问题. (虽然XP已经被淘汰,但在中国至少还有6%的份额,尤其企业.研究所等.尝试此还是有意义的--) 但根据需 ...
- ***入门基础知识(超全)
***入门基础知识(超全) [sell=2] DOS 常用命令: dir 列文件名 deltree 删除目录树 cls 清屏 cd 改变当前目录 copy 拷贝文件 diskcopy 复制磁盘 de ...
- 半小时入门MATLAB编程入门基础知识:
https://learnxinyminutes.com/docs/zh-cn/matlab-cn/ 半小时入门MATLAB编程入门基础知识: % 以百分号作为注释符 %{ 多行注释 可以 这样 表示 ...
- 计算机键盘输入法基础知识,电脑打字入门基础知识
电脑打字入门基础知识 导语:用电脑打字是最常见的操作,它实际上就是如何用键盘输入汉字.在准备输入汉字之前,要熟悉键盘,进而选择适合自己的汉字输入法进行汉字输入.下面是小编给大家整理的电脑打字入门基础知 ...
- 搬砖篇--002 几何入门基础知识
几何入门基础知识 一. ξ\xiξ 多边形内角和外角和 二. ξ\xiξ 圆周角与圆心角 三. ξ\xiξ 相似与全等三角形 一. ξ\xiξ 多边形内角和外角和 1.观察下图所示,通过线性平移 ,可 ...
- 【PMP考试扫盲】超详细的PMP项目管理入门基础知识,考证必看
我今年 6 月刚考过 PMP,发现很多小伙伴都对 PMP 还不了解,这篇文章就是对 PMP 基础知识的一个全面解答,文章有点长,先给大家上个目录,方便大家直接查看对应内容~ 目录 [PMP考试扫盲]超 ...
- 学单片机有前景吗?单片机入门基础知识
任何一个行业,都难免会看到一群喷子,喷行业辣鸡,喷职业苦逼. 最近看到很多喷单片机这个行业的,说这个行业工资低,学的东西又多,没前途. 还不如去学习纯软件,收入上限高. 一.无际对这个行业的看法(当小 ...
- Spark —— 闪电般快速的统一分析引擎 —— 入门基础知识
Spark 入门基础知识 Spark 的特点 速度快 使用方便 通用 兼容 Spark 基础 下载 独立部署模式(Standalone) 弹性分布式数据集 Scala shell 1. 数组中的最值: ...
最新文章
- Linux下,各种解压缩命令集合
- 10.matlab中sort , min/max以及ceil 函数
- djangorestframework源码分析1:generics中的view执行流程
- 买电脑怎么看配置_电脑配置怎么选?
- 10 个最值得 Python 新人练手的有趣项目 | 赠书
- python全栈开发笔记---基本数据类型--数字型魔法
- BSP UI Workbench double click component and see view list
- struct task_struct 结构分析 \linux-1.0\linux\include\linux\sched.h
- 为什么有的人手机通知栏显示的是4G+而有的是HD?
- 软件测试面试必问问题
- 怎样配置炒股用的计算机,炒股专用电脑配置
- 字符串--Leetcode (python)
- Educational Codeforces Round 119 (Rated for Div. 2) 做题日志
- 图灵奖得主珀尔 | 在大数据、概率之外,我们仍需要问因果关系的相关问题
- 创建 DBLink 的方法
- 拉起Docker容器初始化数据源时,报:org.postgresql.util.PSQLException: The connection attempt failed. 的解决办法
- 因果模型五:用因果的思想优化风控模型——因果正则化评分卡模型
- 模块结构篇:7.1)动力型塑料齿轮轮系设计步骤详解
- 【kafka】-入门篇
- 1003. Universal Travel Sites (35)