Qt学习笔记
QT学习笔记2:QT中常用函数
QT学习笔记2:QT中常⽤函数⼀、QString转numberQString number(long n, int base = 10)QString number(ulong n, int base = 10)QString number(int n, int base = 10)QString number(uint n, int base = 10)QString number(qlonglong n, int base = 10)QString number(qulonglong n, int base = 10)QString number(double n, char format = 'g', int precision = 6)整形的转换格式都是⼀样的,第⼀个参数是⼗进制要转换的整数,第⼆个参数指定以什么进制来转换,默认是⼗进制,⽐如:QString strNumDec = QString::number(55, 10); //转化成10进制QString strNumHex = QString::number(55, 16); //16进制QString strNumBit = QString::number(55, 2); //2进制第⼆个参数base必须在[2,36]之间,当base为10以外的值时,第⼀个参数n将被视为⽆符号整数。
⼆、number 转 QStringdouble toDouble(bool * ok = 0) constfloat toFloat(bool * ok = 0) constint toInt(bool * ok = 0, int base = 10) constlong toLong(bool * ok = 0, int base = 10) constqlonglong toLongLong(bool * ok = 0, int base = 10) constshort toShort(bool * ok = 0, int base = 10) constQString也提供了⼀系列转换成数值的函数,参数ok指⽰转换是否出错,参数base指⽰当前QString是什么进制,如QString str = "55";bool ok;int numBit = str.toInt(&ok, 2);int numOct = str.toInt(&ok, 8);int numDec = str.toInt(&ok, 10);int numHex = str.toInt(&ok, 16);三、QPixmap加载图⽚并获取图⽚宽和⾼void Dialog::paintEvent(QPaintEvent *){QPainter painter(this);QPixmap pix;//加载图⽚pix.load("D:\\1001.jpg");//获得图⽚的宽和⾼qreal width = pix.width();qreal height = pix.height();//图⽚放⼤两倍pix = pix.scaled(width*2,height*2,Qt::KeepAspectRatio);painter.drawPixmap(0,0,100,100,pix);}四、QString与String转换//QString转换Stringstring s = qstr.toStdString();//String转换QStringQString qstr2 = QString::fromStdString(s);这样虽然能成功,但是会出现中⽂乱码情况。
qt学习笔记
汇文教育;QFil eInfo类1、q filei nfo提供有关文件系统中的,文件的名称和位置信息(路径),它的访问权限,以及它是否是一个目录或符号链接,该文件的大小和最后修改/读取时间也可用。
2、QFil eInFo可以指向一个文件,一个相对或一个绝对文件路径,绝对文件路径开始与目录分隔符“/”或驱动器的规格(除了在UNI X),相对文件名开始有一个目录名或一个文件名,并指定一个相对于当前工作目录的路径.一个绝对路径的一个例子是一个字符串“/tmp /qua ltz”,相对路径可能看起来像“src / fa tlib”,你可以使用这个函数isrel ative()来检查 qfil einfo是否使用相对或绝对路径的文件,你可以调用函数co nvert toabs()转换 qfil einfo的相对路径为绝对路径。
这q filei nfo文件在构造函数中设置或后setfi le(),使用exi sts()看文件是否存在,si ze()得到它的大小。
加速性能,qf ilein fo缓存文件有关的信息,因为文件可以被其他用户或程序更改,甚至由同一程序的其他部分,这个函数refr esh(),刷新文件信息,如果你想关闭一个qfi leinf o的缓存和强制访问文件系统每次请求信息,你可以调用setCa ching(FALS E).文件的类型是获得通过i sfile(),is dir()和isSy mlink()该文件的日期由 crea ted(), las tModi fied() and last Read(),文件的访问权限由isRe adabl e(),isWri table() an d isE xecut able()获得。
QT学习笔记8:QDir类及其用法总结
QT学习笔记8:QDir类及其⽤法总结简介QDir类提供了访问系统⽬录结构及其内容的与平台⽆关的⽅式。
头⽂件:#include <qdir.h>QDir类⽤来操作路径名及底层⽂件系统,获取关于⽬录路径及⽂件的相关信息,也可以⽤来获取Qt资源系统的⽂件信息。
QDir类使⽤相对或绝对⽂件路径来指向⼀个⽂件/⽬录。
绝对路径是从⽬录分隔符“/”或者带有⼀个驱动器标识(除了在Unix下)。
如果总是使⽤“/”作为⽬录分隔符,Qt将会把你的路径转化为符合底层的操作系统的。
相对⽂件名是由⼀个⽬录名称或者⽂件名开始并且指定⼀个相对于当前路径的路径。
绝对路径⽰例:其中第⼆个路径是Windows系统下,它指向的路径是:C:\Documents and Secctings。
相对路径⽰例:注意当前路径是指应⽤程序的⼯作⽬录,⽽QDir⾃⼰的路径可以通过setPath()设置并且通过path()获得。
可以使⽤QDir类的⽅法isRelative()或者是isAbsolute()来判断QDir指向的路径是相对路径还是绝对路径,如果是相对路径,可使⽤⽅法makeAbsolute()将相对路径转换为绝对路径。
1. ⽬录及导航操作QDir类对象所关联的⽬录路径可以使⽤path()函数获得,可以使⽤setPath()⽅法来设置新的路径;可以使⽤⽅法absolutePath()来获得⽬录的绝对路径。
⽬录名可以使⽤dirName()⽅法来获得,该⽅法返回绝对路径中的最后⼀个项⽬,即⽬录名,但如果QDir关联的是当前⼯作⽬录,则返回"."。
可以使⽤mkdir()⽅法来创建⼀个⽬录;使⽤rename()⽅法来对关联⽬录进⾏重命名;使⽤rmdir()⽅法来移除⼀个⽬录;使⽤exists()⽅法检测⽬录是否存在;使⽤refresh()⽅法来刷新⽬录内容。
其余⽅法详见QDir类的API⽂档。
2. ⽂件及⽬录内容⽂件系统中⽬录中⼀般包括⽂件、⼦⽬录及符号链接;可以使⽤count()⽅法来获得QDir类对象关联的⽬录中的条⽬数⽬;可以使⽤entryList()获取所有条⽬的名称;可以使⽤entryInfoList()来获取条⽬的QFileInfo内容。
Qt学习资料
Qt学习资料1. 介绍QML是一种描述语言,主要是对界面效果等的一种描述,它可以结合javaScript来进行更复杂的效果及逻辑实现。
比如做个游戏,实现一些更有趣的功能等2. 简单的例子import Qt4.7Rectangle{width:200height:200color:"blue"}代码是绘制一个蓝色的矩形,宽200 高200,import包含一个qt4.7的包3.基本元素的介绍(自己翻译意思会有出入,敬请见谅)基本可视化项Item 基本的项元素在QML中所有可视化的向都继承他Rectangle 基本的可视化矩形元素Gradient 定义一个两种颜色的渐变过程GradientStop 定义个颜色,被Gradient使用Image 在场景中使用位图BorderImage(特殊的项) 定义一张图片并当做边界AnimatedImage 为播放动画存储一系列的帧Text 在场景中使用文本TextInput 显示可编辑为文本IntValidator int 验证器DoubleValidator double 验证器RegExpValidator 验证字符串正则表达式TextEdit 显示多行可编辑文本基本的交互项MouseArea 鼠标句柄交互FocusScope 键盘焦点句柄Flickable 提供一种浏览整张图片的一部分的效果,具体看例子Flipable 提供一个平面,可以进行翻转看他的前面或后面,具体看例子状态State 定义一个配置对象和属性的集合PropertyChanges 使用一个State描述属性的改变StateGroup 包含一个状态集合和状态变换ParentChange 重新定义父集,也就是换个父节点AnchorChanges 在一个状态中改变anchors动画和变换Behavior 默认的属性变换动画SequentialAnimation 对定义的动画串行播放ParallelAnimation 对定义的动画并行播放PropertyAnimation 属性变换动画NumberAnimation 对实数类型属性进行的动画Vector3dAnimation 对QVector3d进行的属性ColorAnimation 颜色进行的变换动画RotationAnimation 对旋转进行的变换动画ParentAnimation 对父节点进行变换的动画,改变绑定的父节点AnchorAnimation 对anchor 进行改变的动画PauseAnimation 延迟处理SmoothedAnimation 允许属性平滑的过度SpringAnimation 一种加速的效果PropertyAction 允许在动画过程中对属性的直接改变ScriptAction 允许动画过程中调用脚本Transition 在状态变换中加入动作变化工作中的数据Binding 在创建的时候绑定一些数据到一些属性ListModel 定义链表数据ListElement 定义ListModel的一个数据项VisualItemModel 包含可视化项(visual items)到一个view中,相当是一个容器VisualDataModel 包含一个model和一个delegate,model包含需要的数据,delegate设计显示的项的信息,具体的去看例子Package 他的目的是把VisualDataModel共享给多个view,具体还要学习XmlListModel 特殊的一个模式使用XPath表达式,使用xml来设置元素,参考例子XmlRole XmlListModel的一个特殊的角色视图ListView 提供一个链表显示模型视图GridView 提供一个网格显示模型视图PathView 提供一个内容沿着路径来显示的模型Path 定义一个PathView使用的轨迹PathLine 定义一个线性的轨迹PathQuad 定义一个二次贝塞尔曲线的轨迹PathCubic 定义一个三次贝塞尔曲线的轨迹PathAttribute允许绑定一个属性上,具体看例子PathPercent 修改item分配的轨迹不是很明了其中的意思WebView 允许添加网页内容到一个canvas上定位器Column 整理它的子列(纵)Row 整理它的子行(横)Grid 设置它的子到一个网格上Flow 目的是不让他的子项重叠在一起实用Connections 明确连接信号和信号句柄Component 封装QML items 想一个组件一样Timer 提供时间触发器QtObject 基本的元素只包含objectName属性Qt qml全局Qt object提供使用的枚举和函数WorkerScript允许在QML使用线程Loader 控制载入item或组件Repeater 使用一个模型创建多个组件SystemPalette 为Qt palettes提供一个通道FontLoader 载入字体根据名字或URLLayoutItem 允许声明UI元素插入到qtGraphicsView 布局中变换Scale 分派item 缩放行为Rotation 分派item 旋转行为Translate 分派item 移动行为4.基本元素的使用例子1. Item位置是0,0 宽高分别是200Item{x:0;y:0;width:200;height:200;}2. Rectangle位置是:0,0宽高分别是200,颜色是红色Rectangle{x: 0; y: 0;width: 200; height: 200;color: "red"}3.Gradient GradientStop分别在总高度的0 颜色红色总高度的1/3 黄色总高度的1是绿色Rectangle{width:100;height:100gradient:Gradient{GradientStop{position:0.0;color:"red"}GradientStop{position:0.33;color:"yellow"}GradientStop{position:1.0;color:"green"}}}4.Image设置一张图片Image{source:"../Images/button1.png"}5.BorderImage他将一张图片分成9部分当图片进行缩放的时候A.1 3 7 9 位置的都不会进行缩放B. 2 8将根据属性horzontalTileMode 进行缩放C.4 6 将根据属性verticalTileMode 进行缩放D.5 将根据属性horzontalTileMode 和verticalTileMode 进行缩放BorderImage{width:180;height:180//分割1~9块的4个点是根据border设置的坐标来实现的//本别是距离坐标上边右边下边的距离border{left:30;top:30;right:30;bottom:30}horizontalTileMode:BorderImage.StretchverticalTileMode:BorderImage.Stretchsource:"../Images/button1.png"}6.AnimatedImage主要用于播放gif图片Rectangle{width:animation.width;height:animation.height+8AnimatedImage{id:animation;source:"animation.gif"}Rectangle{property int frames:animation.frameCountwidth:4;height:8x:(animation.width-width)*animation.currentFrame/frames y:animation.heightcolor:"red"}}7.Text显示文本(具体的其他设置请看文档)Text{text:"text"}8.TextInput下面是设置一个输入文本框,框中的字符串是Text, 并设置鼠标可以选择文本TextInput{text:"Text"selectByMouse:true;//鼠标可以选择}9.IntValidator int 型验证器,和输入框结合后就是只能输入整型数据T extInput{//最高可以输入100,最低输入10IntValidator{id:intval;bottom:10;top:100;}width:100;height:20;text:"";//使用校验器validator:intval;}10.DoubleValidator只能输入浮点数TextInput{//最高可以输入100,最低输入10decimals最多有多少位小数//notation表示是使用科学计数法还是(默认),还是直接的小数当获取里面的数据DoubleValidator{id:intval;decimals:4;bottom:10;top:100;nota tion:DoubleValidator.StandardNotation}width:100;height:20;text:"";//使用校验器validator:intval;}11.RegExpValidator使用正则表达式TextInput{//使用一个正则表达式来控制输入的字符串///^[a-zA-Z]{1}[0-1]{0,2}[a-z]{1,3}$/表示开始位置必须是一个大写或小写字母//接下来是0~2个的数字而且是0或1,在接下来是1~3个的小写字母RegExpValidator{id:intval;regExp:/^[a-zA-Z]{1}[0-1]{0,2}[a-z]{1,3}$/;}width:100;height:20;text:"";//使用校验器validator:intval;}12.TextEdit显示一段hello world的html文本和TextInput相同TextEdit{width:240text:"Hello World!"font.family:"Helvetica"font.pointSize:20color:"blue"focus:true}13.MouseArea主要是用来判断鼠标事件的区域Rectangle{x:0;y:0;width:100;height:100;Rectangle{id:mousrectx:20;y:20;width:20;height:20;color:"blue"MouseArea{//使用父的区域作为鼠标判断的区域及x:20;y:20;width:20;height: 20;anchors.fill:parent;//但鼠标按下后mousrect变成红色,当鼠标松开后变成蓝色onPressed:{mousrect.color="red";}onReleased:{mousrect.color="blue";}}}}14.FocusScope不是很清楚说的什么,好像是说同一个时刻只有一个item有焦点15.Flickable显示一个200x200的框,框中显示图片上200x200的部分Flickable{width:200;height:200//设置使用图片的宽高,而现实的是200x200的现实框contentWidth:image.width;contentHeight:image.heightImage{id:image;source:"../Images/need.png"}}16.Flipable包含两个面,一个前面,一个后面,实现一个控件前后的翻转效果,并且在后面可以添加一些控制Flipable{id:flipablewidth:240height:240property int angle:0property bool flipped:falsefront:Image{source:"front.png"}//前面back:Image{source:"back.png"}//后面//旋转动画前后面交换transform:Rotation{origin.x:flipable.width/2;origin.y:flipable.height/2axis.x:0;axis.y:1;axis.z:0//rotate around y-axisangle:flipable.angle}states:State{name:"back"PropertyChanges{target:flipable;angle:180}when:flipable.flipped}transitions:Transition{NumberAnimation{properties:"angle";duration:1000}}MouseArea{anchors.fill:parentonClicked:flipable.flipped=!flipable.flipped}}17.State//当鼠标按下后改变myRect的颜色Rectangle{id:myRectwidth:100;height:100color:"black"MouseArea{id:mouseAreaanchors.fill:parentonClicked:myRect.state=='clicked'?myRect.state="":myRect. state= 'clicked';}//设置状态states:[State{name:"clicked"PropertyChanges{target:myRect;color:"red"}}]}18.PropertyChanges//当鼠标按下后改变状态//状态里面的属性改变包含了文本和颜色的改变Text{id:myTextwidth:100;height:100text:"Hello"color:"blue"states:State{name:"myState"//当这个状态被设置的时候,将改变myText的文本和颜色PropertyChanges{target:myTexttext:"Goodbye"color:"red"}}MouseArea{anchors.fill:parent;onClicked:myText.state='myS tate'} }19.StateGroup一个状态组中可以包含很多的状态和变化,而状态也可以和变换绑定. 20.StateChangeScript在状态中可以对脚本中的函数进行调用// Sc.jsfunction changeColor() // 返回蓝色{return "blue";}// test.qmlimport"Sc.js"as CodeRectangle{id:rectwidth:50;height:50color:"red"MouseArea{anchors.fill:parentonClicked:rect.state="first" // 鼠标按下改变状态}states:State{name:"first"; StateChangeScript{name:"myScript";script:rect.color=Code.changeColor();}}}21.ParentChang把指定的item换一个item父节点Item{width:200;height:100Rectangle{id:redRectwidth:100;height:100color:"red"}//本来blueRect的父节点是Item当鼠标按下后他被设置到redRect上Rectangle{id:blueRectx:redRect.widthwidth:50;height:50color:"blue"states:State{name:"reparented"//改变父节点ParentChange{target:blueRect;parent:redRect;x:10;y:10}}MouseArea{anchors.fill:parent;onClicked:blueRect.state="re parented"} }}22.AnchorChangesRectangle{id:windowwidth:120;height:120color:"black"Rectangle{id:myRect;width:50;height:50;color:"red"}states:State{name:"reanchored"AnchorChanges{//改变myRect的anchors属性target:myRectanchors.top:window.topanchors.bottom:window.bottom}PropertyChanges{target:myRectanchors.topMargin:10anchors.bottomMargin:10}}//鼠标事件MouseArea{anchors.fill:parent;onClicked:window.state="rea nchored"} }23.BehaviorRectangle{id:rectwidth:100;height:100color:"red"//针对宽度的动画Behavior on width{NumberAnimation{duration:1000}}MouseArea{anchors.fill:parentonClicked:rect.width=50}}24.SequentialAnimation串行播放多个动画Rectangle{id:rect1width:500;height:500Rectangle{id:rect;color:"red"width:100;height:100//串行播放多个动画,先横向移动,在纵向移动SequentialAnimation{running:true;NumberAnimation{target:rect;properties:"x";to:50;duration: 1000}NumberAnimation{target:rect;properties:"y";to:50;duration:1000 } }}}25.ParallelAnimationRectangle{id:rect1width:500;height:500Rectangle{id:rect;color:"red"width:100;height:100//并行播放动画,同时横向和纵向移动ParallelAnimation{running:true;NumberAnimation{target:rect;properties:"x";to:50;duration: 1000}NumberAnimation{target:rect;properties:"y";to:50;duration:1000 } }}}26.PropertyAnimationRectangle{id:rectwidth:100;height:100color:"red"。
QT学习笔记7:C++函数默认参数
QT学习笔记7:C++函数默认参数C++中允许为函数提供默认参数,⼜名缺省参数。
使⽤默认参数时的注意事项:①有函数声明(原型)时,默认参数可以放在函数声明或者定义中,但只能放在⼆者之⼀。
建议放在函数声明中。
double sqrt(double f = 1.0); //函数声明double sqrt(double f) //函数定义{// ....}②没有函数(原型)时,默认参数在函数定义时指定.//没有函数声明double sqrt(double f = 1.0) //函数定义③在具有多个参数的函数中指定默认值时,默认参数都必须出现在不默认参数的右边,⼀旦某个参数开始指定默认值,它右边的所有参数都必须指定默认值.int f (int i1, int i2 = 2, int i3 = 3); // 正确int g (int i1, int i2 = 2, int i3); // 错误, i3未指定默认值int h (int i1 = 1, int i2, int i3 = 3); // 错误, i2未指定默认值④在调⽤具有默认参数的函数时, 若某个实参默认,其右边的所有实参都应该默认。
//例如, ⼀个函数声明如下int f(int i1 = 1, int i2 =2, int i3 = 3);//调⽤函数 f()f(); //正确, i1=1, i2=2, i3=3f(3); //正确, i1=3, i2=2, i3=3f(2, 3); //正确, i1=2, i2=3, i3=3f(4, 5, 6); //正确, i1=4, i2=5, i3=6f(, 2, 3); //错误, i1默认,其右边的i2和i3没有默认注意的是:带缺省值的参数必须放在参数列表的最后⾯。
因为传参是从右向左的。
缺省参数不能同时在函数声明和定义中出现,只能⼆者留其⼀。
缺省值必须是常量或者全局变量。
C语⾔并不⽀持缺省。
QT学习笔记-29.使用QT HTTP下载网络文件
QT学习笔记-29.使用QT HTTP下载网络文件QT附带的例子比较好:class HttpWindow : public QDialog{Q_OBJECTpublic:HttpWindow(QWidget *parent = 0);void startRequest(QUrl url);private slots:void downloadFile();void cancelDownload();void httpFinished();void httpReadyRead();void updateDataReadProgress(qint64 bytesRead, qint64 totalBytes);void enableDownloadButton();void slotAuthenticationRequired(QNetworkReply*,QAuthenticator *);private:QLabel *statusLabel;QLabel *urlLabel;QLineEdit *urlLineEdit;QProgressDialog *progressDialog;QPushButton *downloadButton;QPushButton *quitButton;QDialogButtonBox *buttonBox;QUrl url;QNetworkAccessManager qnam;QNetworkReply *reply;QFile *file;int httpGetId;bool httpRequestAborted;};其中槽有:1.开始下载2.取消下载3.预备下载4.下载完成5.进度回调等实现为:void HttpWindow::startRequest(QUrl url){reply = qnam.get(QNetworkRequest(url));connect(reply, SIGNAL(finished()),this, SLOT(httpFinished()));connect(reply, SIGNAL(readyRead()),this, SLOT(httpReadyRead()));connect(reply, SIGNAL(downloadProgress(qint64,qint64)),this, SLOT(updateDataReadProgress(qint64,qint64)));}该函数主要针对给定url绑定事件void HttpWindow::downloadFile(){url = urlLineEdit->text();QFileInfo fileInfo(url.path());QString fileName = fileInfo.fileName();fileName = "downloadfile.dat";if(fileName.isEmpty())fileName = "index.html";if(QFile::exists(fileName)) {if (QMessageBox::question(this, tr("HTTP"),tr("There already exists a file called %1 in ""the current directory. Overwrite?").arg(fileName), QMessageBox::Yes|QMessageBox::No, QMessageBox::No)== QMessageBox::No)return;QFile::remove(fileName);}file = new QFile(fileName);if (!file->open(QIODevice::WriteOnly)) {QMessageBox::information(this, tr("HTTP"),tr("Unable to save the file %1: %2.").arg(fileName).arg(file->errorString()));delete file;file = 0;return;}progressDialog->setWindowTitle(tr("HTTP"));progressDialog->setLabelText(tr("Downloading %1.").arg(fileName));downloadButton->setEnabled(false);// schedule the requesthttpRequestAborted = false;startRequest(url);}当点击下载的时候,会执行该函数获取url链接,生成本地文件,...void HttpWindow::cancelDownload(){statusLabel->setText(tr("Download canceled."));httpRequestAborted = true;reply->abort();downloadButton->setEnabled(true);}终止下载,主要函数是reply->abort();void HttpWindow::httpFinished(){if (httpRequestAborted) {if (file) {file->close();file->remove();delete file;file = 0;}reply->deleteLater();progressDialog->hide();return;}progressDialog->hide();file->flush();file->close();QVariant redirectionTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribut e);if (reply->error()) {file->remove();QMessageBox::information(this, tr("HTTP"),tr("Download failed: %1.").arg(reply->errorString()));downloadButton->setEnabled(true);} else if (!redirectionTarget.isNull()) {QUrl newUrl = url.resolved(redirectionTarget.toUrl());if (QMessageBox::question(this, tr("HTTP"),tr("Redirect to %1 ?").arg(newUrl.toString()),QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { url = newUrl;reply->deleteLater();file->open(QIODevice::WriteOnly);file->resize(0);startRequest(url);return;}} else {QString fileName = QFileInfo(QUrl(urlLineEdit->text()).path()).fileName();statusLabel->setText(tr("Downloaded %1 to current directory.").arg(fileName));downloadButton->setEnabled(true);}reply->deleteLater();reply = 0;delete file;file = 0;}下载结束动作void HttpWindow::httpReadyRead(){// this slot gets called every time the QNetworkReply has new data.// We read all of its new data and write it into the file.// That way we use less RAM than when reading it at the finished()// signal of the QNetworkReplyif (file)file->write(reply->readAll());}写文件回调void HttpWindow::updateDataReadProgress(qint64 bytesRead, qint64 totalBytes){if (httpRequestAborted)return;progressDialog->setMaximum(totalBytes);progressDialog->setValue(bytesRead);}进度回调要点:1.针对QNetReply绑定需要的信号和槽2.实现需要的槽函数。
QT学习笔记4:QT中GraphicsView编程
QT学习笔记4:QT中GraphicsView编程⼀、QGraphicsScene1、QGraphicsSceneQGraphicsScene继承⾃QObject,是⼀个管理图元的容器,与QGraphicsView合⽤可以在2D屏幕上显⽰如线、三⾓形、⽂本、⾃定义图元等图元。
QGraphicsScene是不可见的,只⽤于管理图元。
为了查看场景,需要创建⼀个视图组件。
⼀个场景分为三个层:图元层、前景层和背景层。
场景的绘制总是从背景层开始,然后是图形项层,最后是前景层。
2、事件处理与传播QGraphicsScene的责任之⼀是传播来⾃视图的事件。
要发送⼀个事件到场景,需要构造⼀个继承⾃QEvent的事件,使⽤QApplication::sendEvent()函数发送事件。
event()函数负责派发事件到各个图元。
常⽤的事件会被便利事件处理函数处理,如⿏标按下事件会被mousePressEvent()函数处理。
按键事件会被派发到焦点图元。
为了设置焦点图元,可以调⽤setFocusItem()函数,或是图元⾃⾝调⽤QGraphicsItem::setFocus()函数。
调⽤focusItem()函数可以获取当前的焦点图元。
为了兼容图形组件,场景维护着⾃⼰的焦点信息。
默认场景并没有焦点,并且所有的按键事件会别丢弃。
如果setFocus()函数被调⽤,或是场景中⼀个图元获得了焦点,场景会⾃动获得焦点。
如果场景有焦点,hasFocus()函数会返回true,按键事件会被发送到焦点图元。
如果场景失去了焦点,⽽图元有焦点(如调⽤clearFocus()函数),场景会维护图元的焦点信息,⼀旦场景重新获得焦点,会确保最后⼀个有焦点的图元获得焦点。
对于悬停效果,QGraphicsScene会派发悬停事件,如果某个图元接受了悬停事件(调⽤QGraphicsItem::acceptHoverEvents()),当⿏标进⼊图元的区域时,图元会接收到⼀个GraphicsSceneHoverEnter事件。
QtModelView学习笔记(七)
QtModelView学习笔记(七)Delegate 类概念与MVC模式不同,model/view结构没有⽤于与⽤户交互的完全独⽴的组件。
⼀般来讲, view负责把数据展⽰给⽤户,也处理⽤户的输⼊。
为了获得更多的灵性性,交互通过delegagte执⾏。
它既提供输⼊功能⼜负责渲染view中的每个数据项。
控制delegates的标准接⼝在QAbstractItemDelegate类中定义。
Delegates通过实现paint()和sizeHint()以达到渲染内容的⽬的。
然⽽,简单的基于widget的delegates,可以从QItemDelegate⼦类化,⽽不是QAbstractItemDelegate,这样可以使⽤它提供的上述函数的缺省实现。
delegate可以使⽤widget来处理编辑过程,也可以直接对事件进⾏处理。
使⽤现成的delegateQt提供的标准views都使⽤QItemDelegate的实例来提供编辑功能。
它以普通的风格来为每个标准view渲染数据项。
这些标准的views包括:QListView,QTableView,QTreeView。
所有标准的⾓⾊都通过标准views包含的缺省delegate进⾏处理。
⼀个view使⽤的delegate可以⽤itemDelegate()函数取得,⽽setItemDelegate() 函数可以安装⼀个定制delegate。
⼀个简单的delegate这个delegate使⽤QSpinBox来提供编辑功能。
它主要想⽤于显⽰整数的models上。
尽管我们已经建⽴了⼀个基于整数的table model,但我们也可以使⽤QStandardItemModel,因为delegate可以控制数据的录⼊。
我们⼜建了⼀个table view来显⽰model的内容,⽤我们定制的delegate来编辑。
我们从QItemDelegate⼦类化,这样可以利⽤它缺省实现的显⽰功能。
qt 基础知识梳理
qt 基础知识梳理QT基础知识梳理QT是一种跨平台的C++应用程序开发框架,通过QT,开发者可以方便地编写可在不同操作系统上运行的应用程序。
本文将梳理一些QT的基础知识,帮助读者了解QT的核心概念和常用功能。
一、QT概述QT是由挪威的Trolltech公司开发的一种C++应用程序开发框架,其目标是提供一种简单、易用、跨平台的开发环境。
QT采用了一种特殊的信号与槽机制,使得开发者可以方便地处理对象之间的事件和通信。
QT还提供了丰富的图形界面控件和工具类,以及强大的跨平台支持,使得开发者可以快速地开发出高质量的应用程序。
二、QT的核心概念1. 对象和类:在QT中,所有的组件都是对象,对象是类的实例。
类定义了对象的属性和行为,开发者可以通过继承和多态等方式来扩展和定制类的功能。
2. 信号与槽机制:信号与槽是QT的核心机制,它通过一种松耦合的方式实现了对象之间的通信。
一个对象可以发送信号,而其他对象可以接收这个信号并作出相应的反应。
开发者可以通过connect 函数将信号和槽函数连接起来,实现对象之间的交互。
3. 事件驱动编程:QT采用了事件驱动的编程方式,当用户执行某个操作时,系统会生成相应的事件,然后QT会将事件发送给相关的对象,对象再根据事件的类型和参数来执行相应的操作。
4. 常用的QT类:QT提供了丰富的类库,包括图形界面控件、文件操作、网络通信、数据库访问等功能。
常用的类有QWidget、QLabel、QPushButton、QLineEdit、QSpinBox等,开发者可以根据自己的需求选择合适的类来构建界面和实现功能。
三、QT的常用功能1. 图形界面开发:QT提供了丰富的图形界面控件和布局管理器,开发者可以通过拖拽和设置属性的方式来构建界面。
同时,QT还提供了强大的绘图和动画功能,可以实现各种复杂的图形效果。
2. 事件处理:QT中的事件可以分为系统事件和自定义事件。
系统事件包括鼠标点击、键盘输入等用户操作,开发者可以通过重写事件处理函数来响应这些事件。
心得体会qt(优秀18篇)
心得体会qt(优秀18篇)本文将从界面设计、可扩展性、易用性、性能和团队合作五个方面探讨Qt的设计心得。
首先,Qt作为一个图形界面框架,界面设计是重要的一环。
在设计界面时,要尽量简明扼要,不要添加过多的视觉元素,以免造成用户的混淆和不适。
突出重点功能,将核心操作置于界面的显著位置。
此外,也要注意UI的可定制性,让用户可以根据自己的需求个性化修改界面。
最重要的是,保持整体布局的一致性,遵循统一的视觉风格,使用户能够快速熟悉和使用。
其次,Qt的可扩展性是其杰出之处。
Qt支持模块化的设计,可以根据需求来选择和集成各种功能模块。
通过使用插件机制,我们可以轻松地添加、升级和删除功能,而不需要对整个应用程序进行重构。
这有助于提高代码的重用性和维护性,并为应用程序的发展和扩展提供了很大的灵活性。
另外,易用性也是一个重要的考虑因素。
Qt提供了丰富的自定义控件和工具,使我们能够快速构建用户友好的界面。
通过合理的布局和操作方式,用户可以直观地理解和使用应用程序。
同时,我们还可以利用Qt的事件和信号槽机制来实现交互动作和响应,使用户操作更加便捷和流畅。
总之,良好的易用性可以帮助我们吸引和留住用户。
与此同时,性能也是设计中需要重点关注的一个方面。
在使用Qt进行设计时,要尽量减少资源的占用和系统的开销。
例如,可以合理使用内存和处理器资源,优化算法和数据结构,减少重复计算和无效操作。
此外,我们还可以使用Qt提供的性能调优工具,如Qt分析器和性能监视器,来识别和解决性能瓶颈。
通过不断优化和改进,我们可以提高应用程序的响应速度和效率。
最后,团队合作是一个成功的设计过程中必不可少的因素之一。
Qt具有良好的跨平台性和协作工具,使团队成员可以在不同的操作系统和环境中共享和协同开发。
我们可以使用版本控制系统,如Git和SVN,来管理代码,确保项目的整体一致性和稳定性。
同时,我们还可以使用QtCreator等集成开发环境来促进团队成员之间的交流和合作。
QT学习笔记5:QMouseEvent鼠标事件简介
QT学习笔记5:QMouseEvent⿏标事件简介⼀、QMouseEvent的详细描述⾸先请注意,Qt中的QMouseEvent⼀般只涉及⿏标左键或右键的单击、释放等操作,⽽对⿏标滚轮的响应则通过QWheeEvent来处理。
QMouseEvent类包含了⽤于描述⿏标事件的参数。
当在⼀个窗⼝⾥按住⿏标按键、或移动、或释放就会产⽣⿏标事件QMouseEvent。
⿏标移动事件只会在按下⿏标按键的情况下才会发⽣,除⾮通过显式调⽤QWidget::setMouseTracking()函数来开启⿏标轨迹,这种情况下只要⿏标指针在移动,就会产⽣⼀系列的⿏标事件;在⼀个窗⼝中,当⿏标按键被按下时,QT会⾃动捕捉⿏标轨迹,⿏标指针所在的⽗窗⼝会继续接受⿏标事件,直到最后⼀个⿏标按键被释放。
⼆、QMouseEvent的传递⼀个⿏标事件包含⼀些指定的接受标志flag⽤于指出该事件是否会被接收和处理,如果⿏标指针所在的⽗窗⼝不接收该事件则可以调⽤函数ignore()予以忽略;多个重叠的窗⼝在实现⾥好⽐⼀个递归的倒⽴树,⿏标事件会沿着⿏标指针所在的⽗窗⼝的链表向上传递,直到某个窗⼝调⽤accept()函数进⾏事件处理,否则该事件将被过滤销毁掉;如果⼀个⿏标事件传递给⿏标指针所在的窗⼝,⽽该窗⼝的QT::WA_NoMousePropagation位置为TRUE,则该事件不会通过⽗窗⼝继续向上传递。
可以通过函数pos()、x()、y()得知⿏标事件发⽣时⿏标指针相对于窗⼝的位置。
如果把移动窗⼝作为⼀次⿏标事件,可以通过函数globalPos()返回的全局坐标值避免窗⼝的抖动。
可以使⽤QWidget::setEndabled()来开启/关闭对应的窗⼝是否接受键盘和⿏标事件。
需要对⿏标事件进⾏处理时,通常要重新实现以下⼏个⿏标事件处理函数:QWidget::mousePressEvent()QWidget::mouseReleaseEvent()QWidget::mouseDoubleClickEvent()QWidget::mouseMoveEvent()三、⿏标事件⿏标事件使⽤的时候,加头⽂件#include <QMouseEvent>1.⿏标按下事件void Widget::mousePressEvent(QMouseEvent *event){// 如果是⿏标左键按下if(event->button() == Qt::LeftButton){···}// 如果是⿏标右键按下else if(event->button() == Qt::RightButton){···}}2.⿏标移动事件默认情况下,触发事件需要点击⼀下,才能触发。
qt6 c++开发指南 学习笔记
qt6 c++开发指南学习笔记下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!qt6 c++开发指南学习笔记第一章:Qt6简介。
qt页面设计知识点
qt页面设计知识点Qt页面设计是一门关于Qt框架中页面设计的知识,它涵盖了一系列与用户界面(UI)相关的技术和设计原则。
在这篇文章中,我们将介绍一些重要的Qt页面设计知识点,帮助读者更好地理解和应用这些知识。
一、Qt页面设计基础知识1.1 Qt页面设计的目标Qt页面设计的主要目标是为用户提供直观、友好和易于操作的界面。
通过合理的布局、美观的视觉效果和良好的交互设计,能够提升用户体验,增强产品的竞争力。
1.2 Qt页面设计的原则在进行Qt页面设计时,需要遵循一些设计原则,包括:- 简洁性:页面要简洁明了,避免过多的冗余信息和复杂的布局。
- 一致性:保持页面元素的一致性,如相似按钮的样式和功能。
- 可用性:页面要易于使用和导航,尽量减少用户操作的步骤。
- 可访问性:考虑到不同用户的需求和特殊情况,确保页面对于残障用户也能友好呈现。
- 可靠性:页面要稳定可靠,能够准确响应用户的操作和输入。
二、Qt页面布局设计2.1 布局管理器(Layout Managers)布局管理器是Qt中用于自动化布局的一种机制,它可以根据窗口大小和控件的特性自动调整布局。
常用的布局管理器包括水平布局(HBoxLayout)和垂直布局(VBoxLayout),网格布局(QGridLayout)等。
通过使用布局管理器,可以灵活而高效地设计和调整页面布局。
2.2 窗口、部件和容器在Qt页面设计中,窗口(Window)是页面的主要容器,它可以包含其他部件(Widget)和容器(Container)。
部件是用户界面的基本元素,如按钮、标签等;而容器则是用于组织和管理部件的容器,如窗口、窗体、分组框等。
合理选择和组织窗口、部件和容器,对于页面的布局设计至关重要。
2.3 页面布局设计的技巧在进行Qt页面布局设计时,下面是一些常用的布局技巧:- 使用合适的布局管理器,如水平布局、垂直布局或网格布局,以实现不同的布局需求。
- 合理使用布局控制器(Layout Control)和部件间隔(Spacing)属性,以调整不同部件之间的间距。
明王讲的 qt开发笔记 大纲
明王是一名具有丰富经验的qt开发工程师,他有着多年的qt开发实战经验,曾参与多个大型项目的开发,积累了大量的qt开发经验和技巧。
在这篇文章中,我将根据明王的讲课内容,为大家整理出一份qt 开发笔记大纲,希望能够帮助那些正在学习qt开发的朋友们更好地系统地学习和掌握qt开发的知识。
一、qt开发环境的搭建1. 安装qt开发环境1.1 Windows评台下的qt安装1.2 Linux评台下的qt安装1.3 macOS评台下的qt安装2. qt开发工具的配置2.1 IDE的选择2.2 编译器的选择2.3 qt插件的安装二、qt基础知识1. qt的基本概念1.1 qt的特点1.2 qt的架构1.3 qt的应用范围2. qt的核心模块2.1 QtCore模块2.2 QtGui模块2.3 QtWidgets模块2.4 QtMultimedia模块2.5 QtNetwork模块2.6 QtSql模块2.7 QtWebKit模块2.8 其他模块介绍和应用场景分析三、qt UI设计与布局1. qt的UI设计工具1.1 Qt Designer介绍1.2 Qt Creator介绍2. qt的基本控件2.1 QLabel2.2 QPushButton2.3 QLineEdit2.4 QComboBox2.5 QCheckBox2.6 QRadioButton2.7 其他常用控件介绍3. qt的布局管理3.1 布局管理器的概念3.2 QHBoxLayout3.3 QVBoxLayout3.4 QGridLayout3.5 实际布局案例分析四、qt信号与槽机制1. 信号槽的基本概念1.1 信号和槽的作用1.2 信号槽的连接方式2. 信号槽的使用场景2.1 点击事件处理2.2 定时器事件处理2.3 自定义信号槽的应用2.4 多线程编程中的信号槽使用五、qt网络编程1. qt的网络模块介绍1.1 TCP编程1.2 UDP编程1.3 HTTP编程2. qt网络编程实例2.1 客户端/服务器模型的实现 2.2 文件传输应用案例2.3 网络数据采集与展示六、qt数据库编程1. qt的数据库模块介绍1.1 SQL数据库1.2 NoSQL数据库1.3 数据库连接方式2. qt数据库编程实例2.1 数据库的增删改查操作2.2 数据库事务处理2.3 数据库连接池的实现七、qt跨评台开发技巧1. 跨评台编译1.1 编写高度可移植的qt代码 1.2 跨评台兼容性测试1.3 跨评台发布与打包2. 跨评台开发注意事项2.1 界面效果的统一2.2 评台特定功能的处理2.3 跨评台性能优化策略八、qt性能调优与调试技巧1. qt性能调优工具介绍1.1 qt的性能监控工具1.2 qt的性能调优工具2. qt性能调优实践2.1 内存分析和优化2.2 界面渲染优化2.3 事件处理性能优化3. qt调试技巧3.1 调试工具的使用3.2 代码调试技巧3.3 内存泄露排查方法以上就是明王讲授的qt开发笔记大纲,希期对大家学习qt开发有所帮助。
课题_Qt学习笔记 TableWidget使用说明和增删改操作的实现
看一下效果很简单的一个小功能先说分部讲一下过程再给出详细代码添加数据MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);ui->tableWidget->setColumnCount(2);ui->tableWidget->setRowCount(2);ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"name"<<"age");ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中的方式ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止修改ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); //设置为可以选中单个ui->tableWidget->setItem(0,0,new QTableWidgetItem("zhangsan"));ui->tableWidget->setItem(0,1,new QTableWidgetItem("1"));ui->tableWidget->verticalHeader()->setVisible(false); //隐藏列表头ui->tableWidget->setItem(1,0,new QTableWidgetItem("lisi"));ui->tableWidget->setItem(1,1,new QTableWidgetItem("20"));ui->tableWidget->selectRow(0);}进行增删除修改操作#include "ui_mainwindow.h"#include <QDebug>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);ui->tableWidget->setColumnCount(2);ui->tableWidget->setRowCount(2);ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"name"<<"age");ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中的方式ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止修改ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); //设置为可以选中单个ui->tableWidget->setItem(0,0,new QTableWidgetItem("zhangsan"));ui->tableWidget->setItem(0,1,new QTableWidgetItem("1"));ui->tableWidget->verticalHeader()->setVisible(false); //隐藏列表头ui->tableWidget->setItem(1,0,new QTableWidgetItem("lisi"));ui->tableWidget->setItem(1,1,new QTableWidgetItem("20"));ui->tableWidget->selectRow(0);}MainWindow::~MainWindow(){delete ui;}void MainWindow::on_tableWidget_currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous) {if(previous!=Q_NULLPTR){previous->setBackgroundColor(Qt::transparent);if(current==Q_NULLPTR)return;current->setBackgroundColor(Qt::blue);}void MainWindow::on_btn_Add_clicked(){// QAbstractItemModel *model = ui->tableWidget->model();// model->insertRow(model->rowCount());int cols=ui->tableWidget->columnCount();int rows=ui->tableWidget->rowCount();qDebug()<<rows;ui->tableWidget->insertRow(rows);for(int i=0;i<cols;i++){ui->tableWidget->setItem(rows,i,new QTableWidgetItem("new"+QString::number(rows)));}ui->tableWidget->selectRow(rows);}void MainWindow::on_btn_Del_clicked(){QTableWidgetItem * item = ui->tableWidget->currentItem();if(item==Q_NULLPTR)return;ui->tableWidget->removeRow(item->row());}void MainWindow::on_btn_Modify_clicked(){QModelIndex index = ui->tableWidget->currentIndex();QList<QTableWidgetItem *> listItem = ui->tableWidget->selectedItems();if(listItem.count()==0)return;foreach(QTableWidgetItem * item, listItem) {item->setText("modify");// QTableWidgetItem * item = ui->tableWidget->currentItem();// if(item==Q_NULLPTR)return;// item->setText("modify");}这里有一些对TableWidget的设置说明一下1. 将表格变为禁止编辑在默认情况下,表格里的字符是可以更改的,比如双击一个单元格,就可以修改原来的内容,如果想禁止用户的这种操作,让这个表格对用户只读,可以这样:tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);QAbstractItemView.NoEditTriggers是QAbstractItemView.EditTrigger枚举中的一个,都是触发修改单元格内容的条件:2. 设置表格为整行选择tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中的方式QAbstractItemView.SelectionBehavior枚举还有如下类型3.单个选中和多个选中的设置:tableWidget->setSelectionMode(QAbstractItemView::ExtendedSelection); //设置为可以选中多个目标该函数的参数还可以是:QAbstractItemView.NoSelection 不能选择QAbstractItemView.SingleSelection 选中单个目标QAbstractItemView.MultiSelection 选中多个目标QAbstractItemView.ExtendedSelection QAbstractItemView.ContiguousSelection 的区别不明显,主要功能是正常情况下是单选,但按下Ctrl或Shift键后,可以多选对于水平或垂直方法的表头,可以用以下方式进行隐藏/显示的设置:tableWidget->verticalHeader()->setVisible(false); //隐藏列表头tableWidget->horizontalHeader()->setVisible(false); //隐藏行表头5. 对表头文字的字体、颜色进行设置QTableWidgetItem *columnHeaderItem0 = tableWidget->horizontalHeaderItem(0); //获得水平方向表头的Item对象columnHeaderItem0->setFont(QFont("Helvetica")); //设置字体columnHeaderItem0->setBackgroundColor(QColor(0,60,10)); //设置单元格背景颜色columnHeaderItem0->setTextColor(QColor(200,111,30)); //设置文字颜色6. 在单元格里加入控件:QTableWidget不仅允许把文字加到单元格,还允许把控件也放到单元格中。
Qt - ModelView模式学习笔记
Ref: /superjoel/article/details/5112120一般来说,Model里面并没有真正存储数据(数据少的话也可以直接存储在Model里),它的数据是从真正的“肉(raw)”里取得,如一个disk file,或database的query result set等等。
那么这个model究竟是干什么用的呢?说白了吧,它就是负责将“肉”数据获取并提供给view,然后将view所做的对“肉”数据的修改更新至真正的“肉”中。
所以,读写文件、操作数据库、网络通讯等一系列与数据打交道的工作就在model中做了。
有的时候“肉”可能真的很肥,所以model还有一项重要的工作就是把这些“肉”编号。
这样就出现了Model Index这个非常重要的类。
一般来说,它使用一个2维的编号(row/colum)来对“肉”编号。
但对于tree 这种有层次结构的数据来说,又加上一个parent index作为第3个编号。
即一个父亲下面的叶子也是从0,0开始编号,获取model index的时候用递归来实现。
OK,现在model 已经有了一堆编好号码的“肉”了,谁来买啊?“肉”便宜了。
View适时出现,注意,很多view可以同时来买同一块“肉”。
(汗,不开玩笑了,这篇blog快水了)。
当view需要显示某些数据时,它们通过model index从model中获取数据(调用model的data函数,当model的data变化时,它也会自动发dataChanged signal 给所有的view以便它们更新)。
当然,在view中也可以调用model的setData函数来设定某个model index所对应的数据。
这里要说明一下model中的数据,用QVarient来承载,可以是所有Qt支持的类型,比较贴心的是,数据可以分成多个角色(role),例如Qt::DisplayRole专用于显示,Qt::BackgroundRole用于显示背景色等等。
Qt中常用知识点
Qt中常⽤知识点1:QRegExp 正则表达式QRegExp regExp("[a-zA-Z][1-9][0-9]{0,2}");xxx->setValidator(new QRegExpValidator(regExp,this));lineEdit->setValidator(new QRegExpValidator(regExp,this));2:QObject::connect()connect(objectA,SIGNAL(methodA()),objectB,SLOT(methodB()));//methodA()的输⼊参数可以⽐methodB()的参数多3:QLineEdit ⾏⽂字输⼊widgetlineEdit->hasAcceptableInput(); //返回true or falselineEdit->setText("please input text");button->setEnabled(true); //set true or false4:信号函数的定义和发射class A {Q_OBJECTsignals:void funs(type A,type B); //定义信号函数};type a;type b;emit funs(a,b);//发射上⾯定义的信号函数,当然需要使⽤QObjetc::connect()这个函数把这个信号函数与真实的slot函数绑定起来,slot函数才是真正⼲活的函数5:Qt中可以动态调整窗⼝⼤⼩的Widget有哪些QTabWidgetQListWidget 和 QStackedWidget 配合使⽤QTreeWidget 和 QStackedWidget 配合使⽤6:对⼀个继承QDialog的类,能动态改变窗⼝⼤⼩的⽅法如下://隐藏必要的⼦Widgetxx->hide();yy->hide();//下⾯这个⽅法⾮常关键,会根据xx,yy⼦widget是否显⽰,动态调整窗⼝的⼤⼩layout()->setSizeConstraint(QLayout::SetFixedSize);7:创建⼀个Qt风格的⼦类class MyClass: pulbic QObject{public:MyClass(const string& text,QObject *parent=0);};MyClass::MyClass(const string& text,QObject *parent): QObject(parent){//构造函数的定义}8:QList的使⽤例⼦QList<QString> list;list<<"foo"<<"bar"<<"baz";foreach(QString a,list)qDebug()<<a;#相当好⽤的QListQList<QString> list;list << "first";list.append( "second" );list.prepend( "third" );list.insert( 1, "fourth" );list.insert( 4, "fifth" );9:Qt迭代器的⽤法QList<int> list;list << 23 << 27 << 52 << 52;QListIterator<int> javaIter( list );while( javaIter.hasNext() )qDebug() << javaIter.next();QList<int>::const_iterator stlIter;for( stlIter = list.begin(); stlIter != list.end(); ++stlIter ) qDebug() << (*stlIter);10:使⽤迭代器修改list的元素QList<int> list;list << 27 << 33 << 61 << 62; QMutableListIterator<int> javaIter( list );while( javaIter.hasNext() ){int value = javaIter.next() + 1;javaIter.setValue( value );qDebug() << value;}QList<int>::Iterator stlIter;for( stlIter = list.begin(); stlIter != list.end(); ++stlIter ) {(*stlIter) = (*stlIter)*2;qDebug() << (*stlIter);}11:所有widget的分类button:QPushButtonQToolButtonQRadioButtonbox:QCheckBoxQGroupBoxQToolBoxQSpinBoxQDoubleSpinBoxQComboBoxedit:QLineEditQTextEditQDateEditQTimeEditQDateTimeEditwidget:QTabWidgetview:QListViewQTreeViewQTableViewdialog:QInputDialogQProgressDialogQColorDialogQFontDialogQPageSetupDialogQFileDialogQPrintDialogothers:QFrame QLabel QLCDNumber QProgressBarQTextBrowser QSlider QDialQMessageBox QErrorMessage12:在主窗⼝程序中打开新的dialog对话框的⽅式#1 阻塞式:(主窗⼝的内容是⽆法访问的)QDialog dialog;Ui_Dialog a;a.setupUi(&dialog);if(dialog.exec()) // 当点下ok button时会返回accept=true,当点下cancel时会返回reject=0 {}#2 ⾮阻塞式:(访问⼦dialog的同时,也能访问⽗窗⼝)findDialog=new FindDialog(this);connect() //把finddialog的信息传递给接受信息,处理信息的槽函数findDialog->show();findDialog->raise();findDialog->activateWindow();13:关于QTableWidget的使⽤QTableWidget * spreadsheet=new QTableWidget(this);setCentralWidget(spreadsheet);//这个⽅法是QMainWindow的⽅法#得到当前⿏标focus的单元格的⾏坐标和列坐标spreadSheet->currentRow()spreadSheet->currentColumn()#得到当前单元格的内容//如果当前单元格内没有内容,if内容为NULLif(spreadSheet->currentItem()){cout<<spreadSheet->currentItem()->text()<<endl;}#⿏标focus的单元格位置发⽣变化时,触发如下信号函数currentCellChanged(int,int ,int,int)14:主窗⼝widget常⽤的⽅法setWindowTitle();setWindowIcon(QIcon("xx.png"));#在QMainWindow中如何添加菜单栏和⼯具栏#创建需要 actionnewAction=new QAction("&new",this);newAction.setIcon(QIcon("xx.png"));connect(newAction,SIGNAL(),object,SLOT()); //让action⼲相应的活#添加⼀个菜单栏QMenu *fileMenu=menuBar()->addMenu("&File");fileMenu->addAction(neAction);fileMenu->addSeparator();#添加⼀个QToolBarQToolBar * fileToolBar= addToolBar("&file");fileToolBar->addAction(newAction);fileToolBar->addSeparator();//menufile->addSeparator()这个函数也是返回⼀个QAction *类型的数据#在statusBar()中添加widgetstatusBar()->addWidget(label);statusBar()->addWidget(label,1); //从左开始放label,1表⽰⽤空⽩扩展剩下的右边空间statusBar()->showMessage(const QString & str);15:QLabel的所有设置QLabel * label=new QLabel("w999");label->setAlignment(Qt::AlignHCenter);//⽂字对齐⽅式label->setMinimumSize(label-sizeHint());//⽂字宽度最少4个字符,当QLabel中没有字符时,也会保证最少有4个字符的空⽩位置显⽰16:QSettings的⽤法#创建settings对象QSettings settings("Yzs_think", "Application");公司或组织名称:Yzs_think,程序名称:Application#从settings中读出数据,设置应⽤程序的相关参数,可以设置默认值QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();QSize size = settings.value("size", QSize(400, 400)).toSize();resize(size);move(pos);#程序退出前,把需要保存的参数保存到settings中,书上说是保存到注册表中去了,还没有实践过QSettings settings("Yzs_think", "Application");settings.setValue("pos", pos());settings.setValue("size", size());17:窗⼝重要属性设置#保证容器⼀直在top layer(就是常⽤的fix 窗⼝在顶层)w.setWindowFlags(Qt::WindowStaysOnTopHint);18:各类event函数调⽤的条件//event函数被调⽤,分为下⾯⼏种情况:1:⽤户对mouse and keyboard的操作2:定时器时间到了3:⽹络超时4:窗⼝管理器1:上⾯是4类称为event sources,事件产⽣的源头2:event object:这个就是包含事件源有何种改变的事件对象(如QPressedEvent *e)3:event target,这处就是事件会通知给谁(⼀般就是事件处理函数)⼀句话说:event sources发⽣的事件变化,包装到event object中,传递给event target//窗⼝⼤⼩发⽣变化时,或是⿏标从⼀个widget到另⼀个widget时移动时,程序启动时会在构造函数调⽤调⽤之后,调⽤ paintEvent函数(参数类型不能写错)void paintEvent(QPaintEvent *)//点了右上⾓的x时,会调⽤该⽅法void closeEvent(QCloseEvent *)19:关于Qt中的主窗⼝qt中的主窗⼝是是没有⽗窗⼝的有⽗窗⼝的widget,称为⼦部件Qt::WindowFlags作为⽗窗⼝的第⼆个参数,可以定义⽗窗⼝很多重要属性:如下Qt::WidgetQt::DialogQt::SplashScreen#保证容器⼀直在top layer(就是常⽤的fix 窗⼝在顶层)w.setWindowFlags(Qt::WindowStaysOnTopHint);#函数对窗⼝进⾏最⼤,最⼩化,全屏操作setWindowState()#对于主窗⼝,我们⾮常关⼼窗⼝的⼤⼩和出现的位置,下⾯的函数是getter,主窗⼝包含两部分:1:框架部分(如title and border):使⽤x(),y(),pos(),move(),frameGeometry()函数访问2:内容部分,称为⽆框架的窗⼝:使⽤width(),height(),geometry(),setGeometry(),Rect(),Size()函数访问 ,resize()函数是调整内容部分的⼤⼩。
QT 学习笔记widget,MainWindow和Dialog的选择使用
Qt中的每个类,都有一个对应的同名头文件,其中包含其类定义。
例如要使用QApplication类,则需要在程序中添加" #include <QApplication>"QApplication类用于管理应用程序范围内的资源。
其构造函数需要main函数的argc和argv作为参数。
widget被创建时都是不可见的(always created hidden)。
widget中可容纳其它widget。
Qt中的widget在有用户行为或状态改变时会emit signal。
signal可以和slot 函数连接在一起(connect),这样当有signal被emit时,对应的slot函数会被自动调用。
QWidget类的构造函数需要一个QWidget *指针作为参数,表示其parent widget(默认值为0,即不存在parent widget)。
在parent widget被删除时,Qt会自动删除其所有的child widget。
Qt中有三种Layout Manager类:QHBoxLayout,QVBoxLayOut,QGridLayOut。
基本模式是将widget添加进LayOut,由Layout自动接管widget的尺寸和位置。
启动Qt程序时可以通过-style参数改变程序的默认显式风格。
Chapter 2 Creating Dialogs2.1 Subclassing DialogQt中所有dialog的基类是QDialog。
QDialog派生自QWidget。
Qt中所有定义了signal或slot的类,在其类定义的开始处都要使用Q_OBJECT宏。
Qt中的signal关键字实际上是宏定义。
类似的,slots关键字也是宏定义。
Qt所提供的类分为若干模块:QtGui,QtNetWork,QtOpenGL,QtSql,QtSvg和QtXml等。
QObject::tr()函数将输入的字符串转换为其他语言(国际化)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Qt学习笔记王凯武汉·光谷2016.02.24/kao2406/article/details/51089807Chapter1 坐标的概念每个窗体在屏幕的显示的位置是以左上角(top-left)的相对位置来定义的。
左上角的坐标为(0, 0),屏幕的长边为x轴,短边为y轴。
几乎每个窗体都有一个重构的函数setGeometry(x, y, length, width)。
其中x,y就是坐标系。
注意此函数的的坐标的位置是不带边框的,只是现实窗体的位置。
move(x, y)函数则可以设定带边框的坐标。
Chapter2 定义自己的窗体2.1 Q_OBJECT定义窗口类的时候一定要在头文件里面加上Q_OBJECT。
2.2 勿忘父窗口创建子控件的时候要指定父窗口(QWidget *parent)。
3.3 子控件的指针不需要手动delete构造函数在new子窗口后,不用手动delete,由父窗口来管理。
3.4 手动创建窗口的缺点比较麻烦,不能自动调动窗口。
Chapter3 窗口布局(layout)3.1 QLayout布局器其子类为QBoxLayout,又派生了QVBoxLayout和QHBoxLayout。
3.2 添加QLineEdit和QPlainTextEdit窗体addWidget(obj);3.3 QPlainTextEdit随父窗口的变动而变动,体现了灵活性。
这是有Policy(策略)来决定的。
3.4 设置布局器Qwidget::setLayout(layout);来实现的Chapter4 Policy窗口调整的策略Fixed使用sizeHint的大小,不能更大,也不能更小。
Preferred优先使用sizeHint,可大可小。
Expanding使用sizeHint,越大越好。
获取policy的方法QSizePolicy Qwidget::sizePolicy() const;设置policy的方法Void QsizePolicy::setSizePolicy(QSizePolicy);对于纵向布局,我们只关注其高度和纵向policy。
Chapter5 手工布局MyWin::MyWin(QWidget *parent): QWidget(parent){m_lineEdit = new QLineEdit(this);m_textEdit = new QPlainTextEdit(this);m_button = new QPushButton(this);m_button->setText("Ok");QHBoxLayout *hLayout = new QHBoxLayout;hLayout->addWidget(m_lineEdit);hLayout->addWidget(m_button);QVBoxLayout *vLayout = new QVBoxLayout;vLayout->addLayout(hLayout);vLayout->addWidget(m_textEdit);this->setLayout(vLayout);}局部变量hLayout,vLayout都叫父窗口管理(Qt)了,不用手动delete。
Chapter6 可视化布局Qt Designer工具来布局,最后一个控件不需要添加上去,只用点击布局就好。
Chapter7 stretch factor拉伸因子Qt自动拉伸的时候,可以控制拉伸的因子。
在用QtDisigner的时候,文本框的右边选中属性框中的sizePolicy,设置Horizontal Stretch和Vertical Stretch中的值。
对于同一属性,如果是两个文本框,一个为1,一个为3,则在父框口变动的时候,这两个框口相应的边会按照比例来拉伸。
最大值最小值的设置。
minimumSize和maximumSize。
注意和策略QSizePolicy::Maximum的区别,这是一个策略,以sizeHint为最大值,而minimumSize和maximumSize是一个属性,最大的范围。
Chapter8 Qt的事件处理一个动作所对应的反应,就是事件处理。
SIGNAL和SLOT。
SLOT插槽的意思。
VS不能识别ui文件的解决,打开自动生成的ui的头文件,点击V AssistX --〉 tools → Reparse CurrentFile。
Chapter9 QCheckBoxqDebug可以在debug模式下,打印调试信息。
signal:void stateChanged(int state);Display widgets中Text Browser的用法,用于显示一堆文本数据。
Chapter10 QLineEditechoMode 密码模式echoMode输入模式 – 如果是密码则选择password,这样在输入密码的时候,会以加密的形式显示。
对应的是normal,这个则显示明码。
placeholderText:行编辑空白处的提示字符。
文本内容的获取:QString QlineEdit::text();QMessageBox消息窗口:当我们输入密码的时候,密码输入完毕后,点击确定,弹出密码正确或者错误的窗口。
头文件:QMessageBox,用法:QMessageBox::information(this, “title”, “message content”);Chapter11 QComboBox如图:手动创建手动创建项目, QComboBox::addItem(“string”)和insertItem(index, “string”);以上index是下拉框从0开始上往下数的序号。
ui.cmboxLang->addItem("Chi", "ch");ui.cmboxLang->addItem("Eng", "en");ui.cmboxLang->addItem("Fre", "fr");ui.cmboxLang->insertItem(2, "Kor", "ko");关联数据QV ariant &user。
在addItem, insertItem的时候,最后一个参数是默认的,当显式传递参数的时候,则为组合框关联的数据。
如上代码示例中的ch,en,fr,ko。
editable属性QComboBox的第一个私有的属性就是editable,当选中它的时候,组合框里面是可以输入数据的,点击回车的时候,新添一个item。
如图变为editable后的效果:获取当前项的文本QString value = ui.cmboxLang->currentText();当手动输入其他字符的时候,当前项的文本会变成输入的字符。
可是currentItem中的字符,还是之前没有输入字符时候的里面的默认值。
Chpater12 QToolButton如图(没有设置图标和文本的样式):icon最好选择png格式的,因为它是背景透明的。
加上icon以及文本后的效果:toolButtonStyle(文本在icon下面)autoRaise(浮动)模式私有属性autoRaise,表示浮动模式的意思。
浮动模式的意思是当鼠标不在此控件上面的时候,没有外边框,当鼠标在控件上(选上的时候)显示外边框。
如下图鼠标不在控件上:signal toggledtoggled信号只在checkable的button按下去后才产生,参考“This signal is emitted whenever a checkable button changes its state.”Chapter13 QLabel原生态的QLabel设置背景色和前景色右键点击QLabel后,选择“Change StyleSheet”,color是前景色,backgroud-color是背景色。
如下图:换行模式(wordWrap)将此属性选上后,l abe l一次显示不了那么多的文字,则自动换行,如下图:给label加外边框(QFrame --> frameShape --> Box)显示图片收藏资源,R e s o urc e Br o ws e r-->E dit R e s o urc e --> 选择已经下载好的图片,添加进去。
在属性p i xm a p上,选择收藏好的jpg图片。
如果图片太大了,此时我们要缩放图片。
图片的缩放,使之自动适应label的大小(scaleContents)选中scaleContents。
Chapter14 字符集Latin字符集中文字符集GB2312 中文简体国标码(汉字数:6763),有局限性,有些生僻字不能显示。
GBK 扩展中文GB编码(兼容GB2312)。
更通用,因为范围广。
BIG5 中文繁体字符集。
CJK 中日韩大字符集。
Unicode 统一码,映射全球各国的文字。
第一种方案:UTF-32。
太浪费空间。
第二种方案:UTF-16。
1~2 个short来表示。
(unicode没有注明,则为UTF-16)。
第三种方案:UTF-8。
1~4个字节来表示一个字符。
字符集间的转换每种字符集在特定的平台下都有系统API函数来相互转换的。
如w i n do ws下,将GBK转化为un i c ode(UTF-16)的函数Mul ti By te T oWide Ch a r。
Chapter15 QStringVC文件数据存储的格式VC编辑器中代码的存储在中文w i n do ws下是以GBK的形式存在的。
这句话的意味着,在qs t r i n g_s t.cpp 中如下的代码,里面的字符都是GBK的编码形式。
其中英文部分是和un i c ode完全兼容的,但是汉字却不同。
如下的“你好,中国!”,如果直接赋值给QS t r i n g的对象s t r,会有问题。
原因是QS t r i n g类是以un i c ode的编码形式来输出的。
int QString_st::OnBtnTest(){//QString str = "Hi, China!";QString str = "你好,中国!"; // 这样显示会出现乱码。
ui.lineEdit->setText(str);return 0;}GBK字符串转换成QString对象QString QString::fromLocal8Bit ( const char *str, int size = -1 ) [static]如下实例:QString str = QString::fromLocal8Bit("你好,中国!");fromLocal8Bit 的缺陷在windows下loacl8Bit是GBK,linux下local8Bit是UTF-8,所以上述转换的函数并不保险。