声明:参考(最新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)相关推荐

  1. python笔记基础-Python入门基础知识学习笔记之一

    为什么要写这篇文章? 本人做过Objective-C开发,现在在用C#做WinForm开发.近段时间在学习Python入门基础知识时,发现有很多知识点和Objective-C的不一样.故想通过本文记录 ...

  2. C++ VS2017 QT5.12开发在xp环境下运行 [2019]亲测推荐

    项目是C++在vs2017+QT5.12写的,在win7,win8,win10运行无任何问题. (虽然XP已经被淘汰,但在中国至少还有6%的份额,尤其企业.研究所等.尝试此还是有意义的--) 但根据需 ...

  3. ***入门基础知识(超全)

    ***入门基础知识(超全) [sell=2]  DOS 常用命令: dir 列文件名 deltree 删除目录树 cls 清屏 cd 改变当前目录 copy 拷贝文件 diskcopy 复制磁盘 de ...

  4. 半小时入门MATLAB编程入门基础知识:

    https://learnxinyminutes.com/docs/zh-cn/matlab-cn/ 半小时入门MATLAB编程入门基础知识: % 以百分号作为注释符 %{ 多行注释 可以 这样 表示 ...

  5. 计算机键盘输入法基础知识,电脑打字入门基础知识

    电脑打字入门基础知识 导语:用电脑打字是最常见的操作,它实际上就是如何用键盘输入汉字.在准备输入汉字之前,要熟悉键盘,进而选择适合自己的汉字输入法进行汉字输入.下面是小编给大家整理的电脑打字入门基础知 ...

  6. 搬砖篇--002 几何入门基础知识

    几何入门基础知识 一. ξ\xiξ 多边形内角和外角和 二. ξ\xiξ 圆周角与圆心角 三. ξ\xiξ 相似与全等三角形 一. ξ\xiξ 多边形内角和外角和 1.观察下图所示,通过线性平移 ,可 ...

  7. 【PMP考试扫盲】超详细的PMP项目管理入门基础知识,考证必看

    我今年 6 月刚考过 PMP,发现很多小伙伴都对 PMP 还不了解,这篇文章就是对 PMP 基础知识的一个全面解答,文章有点长,先给大家上个目录,方便大家直接查看对应内容~ 目录 [PMP考试扫盲]超 ...

  8. 学单片机有前景吗?单片机入门基础知识

    任何一个行业,都难免会看到一群喷子,喷行业辣鸡,喷职业苦逼. 最近看到很多喷单片机这个行业的,说这个行业工资低,学的东西又多,没前途. 还不如去学习纯软件,收入上限高. 一.无际对这个行业的看法(当小 ...

  9. Spark —— 闪电般快速的统一分析引擎 —— 入门基础知识

    Spark 入门基础知识 Spark 的特点 速度快 使用方便 通用 兼容 Spark 基础 下载 独立部署模式(Standalone) 弹性分布式数据集 Scala shell 1. 数组中的最值: ...

最新文章

  1. Linux下,各种解压缩命令集合
  2. 10.matlab中sort , min/max以及ceil 函数
  3. djangorestframework源码分析1:generics中的view执行流程
  4. 买电脑怎么看配置_电脑配置怎么选?
  5. 10 个最值得 Python 新人练手的有趣项目 | 赠书
  6. python全栈开发笔记---基本数据类型--数字型魔法
  7. BSP UI Workbench double click component and see view list
  8. struct task_struct 结构分析 \linux-1.0\linux\include\linux\sched.h
  9. 为什么有的人手机通知栏显示的是4G+而有的是HD?
  10. 软件测试面试必问问题
  11. 怎样配置炒股用的计算机,炒股专用电脑配置
  12. 字符串--Leetcode (python)
  13. Educational Codeforces Round 119 (Rated for Div. 2) 做题日志
  14. 图灵奖得主珀尔 | 在大数据、概率之外,我们仍需要问因果关系的相关问题
  15. 创建 DBLink 的方法
  16. 拉起Docker容器初始化数据源时,报:org.postgresql.util.PSQLException: The connection attempt failed. 的解决办法
  17. 因果模型五:用因果的思想优化风控模型——因果正则化评分卡模型
  18. 模块结构篇:7.1)动力型塑料齿轮轮系设计步骤详解
  19. 【kafka】-入门篇
  20. 1003. Universal Travel Sites (35)

热门文章

  1. 电压转电流/电流转电压模块
  2. 基于汕超设备的USBFATFS系统
  3. 使用SuperMap iDesktopX数据迁移工具迁移地图文档和符号
  4. ERP系统实施对企业内部控制的利弊分析
  5. CityEngine2019 学习笔记 (1)一 基本操作
  6. OpenCV_05图像变换
  7. MATLAB|绘制波形图
  8. 有一段英文由若干单词组成,单词之间用一个空格分隔。编写程序提取其中所有的单词
  9. python毕业设计作品基于django框架校园网站系统毕设成品(1)开发概要
  10. 计算机音乐会议,ICMC2017国际计算机音乐会议亮相上海