QT怎么学,qt多久能学会
永远的神干货盘点
一、QPainter绘图1.整个绘图系统基于Qpainter,QPianterDevice和QPainEngine三个类
2 .问画师用来执行绘制的操作,QPaintDevice是一个二维空间的抽象,这个二维空间允许q画师在上面进行绘制,也就是q画师的工作空间。
3.QPiantEngine提供了画笔(QPianter)在不同设备上绘制统一的接口100 .QPaintEngine类应用于q画师和QPaintDevice之间,使用人员不必了解其细节。
可以将QPianter理解成一个画家,将QPainterDevice理解为纸张或者是屏幕。
4.夸脱的绘图系统实际上就是使用QPianter在QPainterDevice上进行绘制,它们之间使用QPainEngine进行通讯(也就是翻译q画师的指令)。
矩形:矩形结构
矩形:区域
画笔:笔刷
椭圆:椭圆
setPen:设置画笔画出的边框的颜色
setBrush:设置画笔画出的区域的颜色
5 .问画师有很多以画开头的函数,用于各种图形的绘制,比如:drawLine()、drawRect()、drawEllipse()等
6 .问画师绘图主要属性
Qpen:画笔,用来控制线条的颜色和宽度等
QBrush:画刷,用来填充颜色、渐变特性等
QFont:字体的属性,用来绘制文字时,设置文字的样式和大小等等
练习一:在窗口中设置背景图片第一步:widget.h文件中重写绘图事件
#ifndef WIDGET_H
#定义WIDGET_H
#包含窗口
#包含QPaintEvent
#包含图片
#包括q画师
QT _ BEGIN _命名空间
命名空间Ui {类小部件;}
QT _ END名称空间
类小部件:公共窗口
{
q _对象
公共:
widget(q widget * parent=nullptr);
~ Widget();
受保护:
void paint事件(QPaintEvent *);
//重写绘图事件虚函数
//如果在窗口绘图,必须放在放在绘图事件里实现
//窗口需要重绘时(窗口放大缩小时),绘图事件自动调用(背景图片也作出相应的变化)
私人:
ui:Widget * ui;
};
#endif //WIDGET_H
第二步:在widget.cpp中实现绘图事件
#include widget.h
#include ui_widget.h
Widget:Widget(QWidget *parent)
:QWidget(父级)
,用户界面(新Ui:小部件)
{
ui- setupUi(这个);
}
空的小部件* paint event(qpaint event *)
{
q画师p(这个);
//实例化一个画家,并将此窗口作为他的画图设备
QPixmap像素
pix.load(./图片/图片。png’);
//图片放在和项目同级的文件夹中
p.drawPixmap(0,0,width(),height(),pix);
//p.darwPixmap(0.0.width()、height()、Qpixmap(./图片/图片。png’));
//从原点出发,指定高度为窗口的高度,指定宽度为窗口的宽度
}
Widget:~Widget()
{
删除ui;
}
第三步:结果显示
练习二:在窗口中绘制直线、圆形和矩形、显示文字等#ifndef WIDGET_H
#定义WIDGET_H
#包含窗口
#包含QPaintEvent
#包括q画师
#包括QPen
#包含图片
QT _ BEGIN _命名空间
命名空间Ui {类小部件;}
QT _ END名称空间
类小部件:公共窗口
{
q _对象
公共:
widget(q widget * parent=nullptr);
~ Widget();
受保护:
void paint事件(QPaintEvent *);
私人:
ui:Widget * ui;
};
# endif//WIDGET _ H # include 小部件。 h
#include ui_widget.h
Widget:Widget(QWidget *parent)
:QWidget(父级)
,用户界面(新Ui:小部件)
{
ui- setupUi(这个);
}
空的小部件* paint event(qpaint event *)
{
q画师p(这个);
p.drawPixmap(0,0,width(),height(),QPixmap(./image/p . png ));
QPen笔;
//定义画笔
钢笔。设置宽度(5);
钢笔。设置颜色(Qt:red);//设置颜色
//pen.setColor(QColor(14,9,23));
//rgb设置颜色
p.setPen(钢笔);
p.drawEllipse(40,40,100,100);
p.drawEllipse(80,80,100,100);
p。拉线(50,80,90,40);
//从坐标点(50,80)到坐标点(90,40)
p.drawRect(180,180,50,80);
p.drawLine(500,500,80,90);
QBrush bursh
伯什。设置颜色(Qt:blue);
伯什。设置样式(Qt:solid pattern);
p.setBrush(伯什);
p.drawRect(500,500,80,90);
QFont字体;
字体。setpointsize(40);
字体。设置为粗体(true);
p.setFont(字体);
p.drawText(600,600,QString(多云));
}
Widget:~Widget()
{
删除ui;
}
二。绘图设备(QPixmap,QImage,QBitmap,QPicture)1。绘图设备是指继承QPainterDevice的子类。Qt一共提供了四个这样的类,分别是QPixmap、QBitmap、QImage和QPicture。
2.QPixmap专门优化图像在屏幕上的显示,因此它与底层显示设备密切相关。这里的底层显示设备不是硬件,而是操作系统提供的原生绘图引擎。
3.QBitmap是QPixmap的一个子类,它的颜色深度限制为1。您可以使用QPixmap的isQBitmap()函数来确定这个QPixmap是否是QBitmap。
4.QImage专门针对图像的像素级访问进行了优化。它是一个独立于硬件的绘图系统,实际上是自己绘图。
5.QPicture可以记录和重现QPainter的各种命令。
三。文件操作(QFile,QFileInfo,QDataStream,QTextStream,QBuffter)
1.Qt作为一个通用开发库,提供了跨平台的文件操作能力。
2.Qt通过QIODevice提供了I/O设备的抽象,这些设备具有读写字节块的能力。
QIODevice:所有I/O设备类的父类,提供读写字节块的一般操作和基本接口;
QFileDevice:Qt5是一个新添加的类,它提供了文件操作的一般实现。
qfile:访问本地文件或嵌入资源;
创建和访问本地文件系统的临时文件;
QBuffer:读写内存文件QbyteArray
QProcess:运行外部程序处理进程间通信;
QAbstractSocket:所有套接字类的父类;
QTcpSocket:TCP协议网络数据传输;
QUdpSocket:传输UDP消息;
QSslSocket:使用SSL/TLS传输数据;
四。文件系统分类1。顺序设备
意味着它们的数据只能访问一次:从头到尾,从第一个字节到最后一个字节,中间不能回读最后一个字节。QProcess、QTcpSocket、QUdpSocket和QSslScoket是顺序访问设备。
2.随机访问设备
您可以多次访问任何位置,还可以使用QIODevice:seek()函数来重新定位文件访问位置指针。QFile、QTemporaryFile和QBuffer是随机存取设备。
动词(verb的缩写)基本文件操作。QFile提供了读写文件的能力。通常文件路径作为参数传递给QFile的构造函数。创建对象后,还可以使用setFileName修改对象。QFile需要使用/作为文件分隔符,但是,它会自动将其转换成操作系统要求的格式。比如像C:/Windows这样的路径,在Windows平台下也是可以的。
QFile主要提供关于文件的各种操作,比如打开、关闭、刷新文件。我们可以使用QDataStream或者QTextStream类来读写文件,也可以使用QIODevice类提供的read()、readLine()、readAll()和write()等函数。值得注意的是关于文件本身的信息,比如文件名,文件所在目录的名称等。是通过QFileInfo获取的,而不是自己分析文件路径字符串。
QFile提供了各种相关的文件操作,比如打开文件、关闭文件、刷新文件等。可以使用QDataStream和QTextStream读写文件,也可以使用QIODevice类提供的read()、readline()、readall()和write()等函数。但是,关于文件本身的信息需要通过使用QFileInfo来获取,而不是自己去分析文件路径字符串。
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
QFile文件(“in . txt”);
//使用QFile创建一个名为in.txt的file对象。
如果(!file . open(QIODevice:ReadOnly QIODevice:Text)){
qDebug()“打开文件失败。”;
return-1;
//使用open函数以只读方式打开该文件。
}否则{
而(!file.atEnd()) {
qDebug()file . readline();
}
}
QFileInfo info(文件);
qDebug()info . isdir();
//文件是否是目录
qDebug()info . isexecutable();
//文件是否是可执行文件
qDebug()info . basename();
//直接获取文件名
qDebug()info . complete basename();
//获取完整的文件名
qDebug()info . suffix();
//获取文件后缀名称
qDebug()info . complete suffix();
//获取完整的文件后缀。
返回app。exec();
}
练习三:选择文件,在入条和文本编辑中输入字符串,点击提交按钮写入到选择的文件中//主窗口。h文件
#ifndef MAINWINDOW_H
#定义主窗口_H
#包含主窗口
QT _ BEGIN _命名空间
命名空间Ui {类主窗口}
QT _ END名称空间
类主窗口:公共主窗口
{
q _对象
公共:
主窗口(q widget * parent=nullptr);
~主窗口();
公共插槽:
void onfile已单击();
//选择相应的文件
void onSubmitTextClicked();
void onsubmitserialicked();
私人:
ui:主窗口* ui
};
#endif //MAINWINDOW_H//logger.h文件
#ifndef LOGGER_H
#定义记录器_H
void set日志文件(const char * name);
void log init();
#endif //LOGGER_H//logger.cpp文件
#include qdebug.h
#包括Qmutex
#包含QTextStream
#包含QFile
#包含QDateTime
#包括输入输出流
#包含问题
#包含"主窗口. h "
使用命名空间标准
静态字符*日志文件名称=空
QMutex logMutex
void SetLogFile(const char *name)
{
日志互斥。lock();
日志文件名=(char *)名称;
printf(name=%s\n ,日志文件名);
日志互斥。unlock();
}
void outputMessage(QtMsgType类型,const QMessageLogContext上下文,const QString消息)
//const QString消息
{
如果(日志文件名称==NULL)
返回;
转文本;
开关(类型)
{
案例QtDebugMsg:
text=QString( Debug:);
打破;
案例QtWarningMsg:
text=QString( Warning:);
打破;
案例QtCriticalMsg:
text=QString( Critical:);
打破;
案例QtFatalMsg:
text=QString( Fatal:);
打破;
案例信息消息:
text=QString( Info:);
}
QString context _ info=QString( File:(% 1)Line:(% 2)).arg(QString(context.file)).arg(上下文。行);
QString current _ date _ time=QDateTime:current datetime().toString( yyyy-MM-DD hh:MM:ss );
QString current _ date=QString( % 1 ).参数(当前日期时间);
QString message=QString( % 1% 2% 3% 4 ).参数(当前日期)。参数(上下文信息)。参数(文本)。arg(msg);
日志互斥。lock();
QFile文件(日志文件_名称);
文件。open(QIODevice:只写 QIODevice:Append);
QTextStream text_stream(文件);
文本流。设置编解码器(qtext codec:codec for name( utf-8 );
//QTextCodec * codec=QTextCodec:codecForName( utf-8 );
//QTextCodec:setCodecForLocale(编解码器);
文本流消息”\ r \ n”;
文件。flush();
文件。close();
日志互斥。unlock();
}
void LogInit()
{
qInstallMessageHandler(输出消息);
}//mainwidow.cpp文件
#包含"主窗口. h "
#include ui_mainwindow.h
#include logger.h
#包含QFileDialog
#包含提示框
#包含QByteArray
#包含转
#包含问题
主窗口:主窗口(q widget * parent)
:QMainWindow(父)
,用户界面(新Ui:主窗口)
{
ui- setupUi(这个);
QTextCodec * codec=QTextCodec:codecForName( GDK );
ui-line edit _ file-set enabled(false);
//关闭写功能,只能选择文件
connect(ui- pushButton_file,QPushButton:clicked,this,main window:on file clicked);
connect(ui- pushButton_serial,QPushButton:clicked,this,main window:onsubmitserial clicked);
connect(ui- pushButton_text,QPushButton:clicked,this,main window:onSubmitTextClicked);
}
主窗口:~主窗口()
{
删除ui;
}
void MainWindow:onFileClicked()
{
QString fileName=QFileDialog:get open fileName(
这个,
tr(打开文件),
D:/,
tr(* .txt*.log’));
if (fileName.isEmpty()) {
QMessageBox:警告(这个,’警告!,无法打开文件!);
}
否则{
ui- lineEdit_file- setText(文件名);
char *ch=fileName.toLatin1().data();
setlog文件(ch);
//QByteArray byte=filename。to Latin 1();
//设置日志文件(字节。data());
}
}
void主窗口:onsubmitserialicked()
{
QString ser=ui-line edit _ serial-text();
qInfo(Serial=%s ,q printable(ser));
}
void主窗口:onSubmitTextClicked()
{
QString text=ui-textEdit _ text-toPlainText();
qInfo(text=%s ,q printable(text));
ui-textEdit _ text-clear();
}//main.cpp文件
#包含"主窗口. h "
#包括q应用
#include logger.h
int main(int argc,char *argv[])
{
QApplication a(argc,argv);
主窗口w;
LogInit();
设置日志文件( d://XXX。txt’);
//设置默认的日志文件为xxx.txt
qDebug(“测试日志");
qWarning(测试日志警告);
w。show();
返回a . exec();
}
//实现将输入的内容通过按钮添加到文本文件中
//写入到文本文件中出现乱码
//试着能不能从文件中读取到信息再添加到这个文本文件中
结果显示:
存在的问题:写入中文字符出现乱码,还未解决
练习四:输入互联网协议(互联网协议的缩写)地址,测试能否砰通//widget.h文件
#ifndef WIDGET_H
#定义WIDGET_H
#包含窗口
#包含调试器
#包括进程
#包含问题
#包含QRegExpValidator
#包含QStringList
#包含转
QT _ BEGIN _命名空间
命名空间Ui {类小部件;}
QT _ END名称空间
类小部件:公共窗口
{
q _对象
公共:
widget(q widget * parent=nullptr);
~ Widget();
公共插槽:
void Myping();
私人:
ui:Widget * ui;
};
#endif //WIDGET_H//widget.cpp文件
#include widget.h
#include ui_widget.h
Widget:Widget(QWidget *parent)
:QWidget(父级)
,用户界面(新Ui:小部件)
{
ui- setupUi(这个);
//使用正则表达式限制输入
ui-line edit _ IP-set validator(new QRegExpValidator(QRegExp( \ \ b(?(?25[0-5]2[0-4][0-9][01]?[0-9][0-9]?)\\.){3}(?25[0-5]2[0-4][0-9][01]?[0-9][0-9]?)\ \ b ))))));
connect(ui- pushButton_ip,QPushButton:clicked,this,Widget:Myping);
}
空的小部件* Myping()
{
qDebug() QStringLiteral(开始点击);
ui-文本浏览器-clear();
ui-text browser-setText(qstring literal(请等待));
ui-文本浏览器-update();
QProcess myProcess(这个);
QString program= C:/Windows/System32/cmd。exe ;
QStringList参数;
QString ipaddr
//正则表达式限制输入
IP addr=ui-line edit _ IP-text();
//用户输入的内容
QString message= ping ipaddr
//和砰命令拼接,字符串的拼接直接链接就可
qDebug()消息;
//将拼接后的结果在应用程序输出的位置打印一下
//用于占位
//arguments=ui-line edit _ IP-set input mask( 000。000 .000 .000;);
//参数/c ping www .百度一下。com’;
参数"/c "消息;
myProcess.start(程序,参数);
而(我的过程。waitforfinished(100)==false){
QByteArray qByteRead=我的进程。readall标准输出();
如果(!qByteRead.isEmpty()) {
ui-文本浏览器-append(QString:from local 8 bit(qByteRead));
repaint();
}
}
QByteArray qByteRead=我的进程。readall标准输出();
ui-文本浏览器-append(QString:from local 8 bit(qByteRead));
qDebug()QString:from local 8 bit(qByteRead);
//输出应用程序输出上
qDebug()结束点击;
}
Widget:~Widget()
{
删除ui;
}
结果显示:
练习五:选择文件,然后将文件中的内容读出到文本框中//widge.h文件
#ifndef WIDGET_H
#定义WIDGET_H
#包含窗口
#包含QFileDialog
#包含提示框
#包括QMutex
#包含调试器
#包含QFile
QT _ BEGIN _命名空间
命名空间Ui {类小部件;}
QT _ END名称空间
类小部件:公共窗口
{
q _对象
公共:
widget(q widget * parent=nullptr);
~ Widget();
void set日志文件(const char * name);
私人:
ui:Widget * ui;
};
# endif//WIDGET _ H # include 小部件。 h
#include ui_widget.h
静态char *文件名=空
QMutex logMutex
Widget:Widget(QWidget *parent)
:QWidget(父级)
,用户界面(新Ui:小部件)
{
ui- setupUi(这个);
ui-line edit-set enabled(false);
连接(ui-button,q button:clicked,this,
[=]()
{
QString fileName=QFileDialog:get open fileName(
这个,
tr(打开文件),
D:/,
tr(* .txt*.log’));
if (fileName.isEmpty()) {
QMessageBox:警告(这个,’警告!,无法打开文件!);
}
否则{
ui- lineEdit- setText(文件名);
char *ch=fileName.toLatin1().data();
setlog文件(ch);
}
}
);
connect(ui- pushButton_r,QPushButton:pressed,this,
[=]()
{
QFile文件(文件名);
如果(!文件。open(qio device:ReadOnly qio device:Text)){
qDebug()"打开文件失败。";
返回;
}否则{
而(!file.atEnd()) {
ui-文本浏览器-setText(文件。read all());
}
}
});
}
空的小部件* set log file(const char * name)
{
日志互斥。lock();
filename=(char *)name;
printf(name=%s\n ,文件名);
log mutex . unlock();
}
Widget:~Widget()
{
删除ui;
}
6.读写二进制文件1。QDataStream基于QIODevice提供二进制数据的序列化。数据流是二进制流。数据流是二进制流,完全独立于底层操作系统、CPU或字节顺序(大端或小端)。
,转载请联系作者获得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。