本人是根据Qt4.GUI 那本书里面学习的,有部分内容时书里面转载出来的,大部分原创
这里是制作电子表格时候所经过的路程,当时只是初学,笔记有部分没有这么深度,只是对书里面一些代码写了个人理解
总结:看了一段日子之后,结合自己学过的.NET,C#,CSS,在VS上开发的经历,发现这些之间都是极其的相似,只是这里面多了信号和槽用来联系所有的动作,真的十分有Linux的风格。
第一章:
关于开头选择Dialog还是Widget
Dialog继承于Widget。
Dialog 通常作为一个顶层窗口出现,允许用户进行一些选择,并且返回用户选择结果。
QApplication对象是用来管理整个应用程序所用到的资源。
QLabel是窗口部件,是用来可视化的元素。相当于win中的控件以及容器。
Return app.exec(); 这里是等待响应操作。
Qt的窗口部件通过发射信号来表明一个用户动作已经发生了或者已经与函数连接了。以便发送信号时,槽可以获得自动执行。
QObject::connect(sender,SIGNAL(),receiver,SLOT()),获取参数可以使得参数同步。
这里Object经常被缺省,如果使用的父函数是QObject的继承函数的话。
建立布局
布局类管理类的一个精妙之处在于它们不是窗口部件。相反,它们派生自QLayout,也因此进一步派生自QObject.
记住要qmake制作出makefile不然会报错。
窗口部件的顺序可以用ALT+C/B/F来出发,如果要改变顺序的话,用setTabOrder.。
信号和槽:是Qt编程的基础,它们和C++的成员函数一样,可以是虚函数,被重载,可以保护,私有,被直接调用,参数能是任意形态。
不同在于:槽可以和信号连在一起,这时候,每当发送信号就调动槽。
连接情况
一个信号连接多个槽
多个信号连接同一个槽
一个信号可以与另一个信号相连
连接被移除
第二章:
对话框的建立流程:1.创建并初始化子窗口部件。2.把子窗口部件放到布局中。3.设置Tab键顺序。4.建立信号-槽之间的连接。5.实现对话框的自定义槽。
RegExpValiator
通过简单地增加另外一个间接层就可以解决软件的任何问题。
群组框:GoupBox
动态对话框使用QUiLodaer载入
QUiLoader uiLoader;
QFile file(“sortdialog.ui”);
Qwidget *sortDialog=uiLoader.load(&file);
If(sortDialog){}
用QObject::findChild<T>来访问这个窗体中的子部件。
使用时,。Pro要加上一行:CONFIG +=uitools
2.6内置部件类和对话框类
QT有四种按钮,QPush,QToolButton,QCheckBox,QRadioButton
前两种可以切换按键,QCheckBox可以打开/关闭单独选项。QRadioButton通常用于互斥的地方。
QFrame用于自身绘制直线
QTabWidget和QToolBox是多页窗口部件。
QTextBrower是只读型QTextEdie的子类。
QProgressDialog可以使用于显示错误信息。只是输入一段文本用QInputDialog
QProgressBar 进度条
QMessageBox,QErrorMessage 错误反馈
QColorDialog 颜色盘
QFontDialog 字体框
QFileDialog 文件对话框
QPageSetupDialog 页面设置
QPrintDialog 打印
QWizard 自定义对话框
第三章 建立主窗口
为程序提供图片资源:1.保存图片到文件中,并且在运行时,载入他们。2.把XPM文件包含在源代码中。3.使用Qt的资源机制。
<RCC>
<qresource>
<file>image/icon.png</file>
</qresource>
</RCC>
当引用图片时,要加上:/的形式。
创建主菜单:1.创建并且设置动作2.创建菜单并且把动作添加到菜单上。3.创建工具栏并且把动作添加到工具栏中。
创建快捷键的时候可以适当的QKeySequence::StandardKey枚举值,以适应Qt能够在其他平台运行。
过程:
先new一个Action,接着指针指向setshortcut(设置快捷键),然后指向setstatustip(提示),最后用connect连接信号和槽。
建立menus:
这里值得一提的是建立file项目的时候,可以用分离器让上面联系紧密在一起。
建立edit时,建立子目录所用到的思想是指向一个新的指针再addAction。
函数sizehint:一个部件的理想大小取决于这个窗口部件的内容以及改变内容时的变化。
避免重复设定定位指示器大小,设置W999(最大字符数),对齐方式设置为Qt::AlignHCenter.
还有formula已经添加了文本缩进格式(setindent)。
做好之后
要开始实现相应的功能。
Warning函数的调用:QMessageBox::warning(parent,title,message,button);
下面是实现打开文件对话框的信号槽:
这里值得一提的是:第一个参数时父对象,第二个是标题,第三个是从哪个目录开始读取,第四个是读取的内容(上面是本地文件)。
LoadFile()的实现方法:
If的语句取出了错误的问题是什么。
Save语句的实现:
上面一段怎是实现文件名在标题栏中,在没有保存的标题后加上*
实现的是关闭时的弹出的事件。
函数QString::arg()会使用自己的参数替换最小数字的“%n”,并且参数返回结果%n和最终结果字符串。
是为了避免重复文件重名,显示出最近的文件名
打开最近打开的文件
Qobject能正确地跨越动态库便捷,是可以将动作中data成功的转化为文件。
接下来要实现find窗口和spread交互
接下来要考虑三种情况:1.第一次调用。2.以前调用过,但用户关闭了它。3.以前掉用过,现在能看见。
模态窗口是一旦调用就阻塞应用程序的运行,直至该窗口消失。
这里值得一提的是:QString::mid是用于提取行号,toInt()是为了转化为整数。
接下来是sort的顺从给予的主键排列实现
第一种方法
注意:
第二种:
第三种:
最后是about
存储的设置
这个函数保存了串口的几何形状,最近打开的文件以及showgrid,atuorecalc的设定值。
这里的程序开始读取的设置,是使用QSettings进行设置的,能够读取之前储存的的位置。
用户对应用程序经常有这样的要求:要求它能记住它的settings,比如窗口大小,位置,一些别的设置,还有一个经常用的,就是recentfiles,等等这些都可以通过Qsettings来实现。
当我们创建一个Qsettings的对象时,我们需要传递给它两个参数,第一个是你公司或者组织的名称,第二个事你的应用程序的名称。比如:
Settings = Qsettings(“MySoft”,”QtPad”)
公司名称:MySoft,程序名称:QtPad
假如我们在应用程序中多次要用到Qsettings,为了简单其间,我们可以在主程序中先如下声明。
QtCore.QCoreApplication.setOrganizationName("MySoft")
QtCore.QCoreApplication.setOrganizationDomain("mysoft.com")
QtCore.QCoreApplication.setApplicationName("QtPad")
当然前提是已经 from PyQt4 importQtCore
然后在应用程序的任何地方想要声明一个Qsettings类型的变量,便不需要书写两个参数了,直接用settings = Qsettings即可。
那么如何用它来保持应用程序的settings信息呢?我们以字典数据类型与之类比,它也有key,以及对应的value。比如下面例子:
settings= Qsettings(“MySoft”,”QtPad”)
Mainwindow = QmainWindow()
settings.setValue(“pos”,QVariant(Mainwindow.pos())
settings.setValue(“size”,QVariant(Mainwindow.size())
如何读取Qsettings里的内容呢?如下:
Pos =settngs.value(“pos”).toPoint()
Size =settings.value(“size”).toSize()
当然如果key所对应的value是int型的,也可toInt(),如果没有我们要找的key,则会返回一个nullQVariant 如果用toInt的话会得到0。
那么实际应用中我们一般会如下:
pos=settings.value("pos", QVariant(QPoint(200,200))).toPoint()
size=settings.value("size", QVariant(QSize(400,400))).toSize()
self.resize(size)
self.move(pos)
意思是,如果settings里有以前存下的(用setValue设置的)pos和size的值,则读取,如果没有,不会返回null,而会使用我们给它的起始值——defaultvalue——即应用程序第一次运行时的情况。
新的函数
但是这么做是有隐患的,就是关闭窗口之后,是默认保存窗口部件,没有删除只是隐藏,还是保留在内存中,
QSplashScreen类可以添加开场动画。
函数addstretch()可以平均分割布局。其实就是垂直分割线。
第四章
接下来实现spreadsheet
使用的中央窗口部件:
1.使用一个标准的Qt窗口部件:在这种情况下,文件的存储稚嫩在在其他地方实现(如QMAINWINDOWS)。
2.使用一个自定义的窗口部件:特殊的应用程序需要经常在自定义窗口部件中显示数据。
3.使用一个带布局管理器的普通QWidget:有时,应用晨曦被许多窗口部件所占。这时可以使用一个座位其他部件的父对象的QWidget,以及使用管理器管理部件。
4.使用切分窗口:多窗口一起使用另一种方法是使用QSplitter。它会在水平或者竖直方向排列它的子部件,可以利用切分条控制尺寸。
5.使用多文档界面工作空间:使用的话,中央区域会被QMdiArea窗口部件所占,并且每个多文档界面窗口都是它的一个子窗口。
这里注意:这是将行全部标记为A-Z的标记,而列却是默认即可。
QApplication::setOverrideCursor(Qt::WaitCursor);//设置为等待光标
QApplication::restoreOverrideCursor();//设置为普通光标
一般成对出现
MagicNumber 是魔数一个随机数,不过在内存里面对应这一种形式的文件。
Quint是设置变量为数,防止随着平台的变化而变化。
foreach (QTableWidgetItem *item,items)
相当于把items 从头遍历一边
Emit 信号传递
Append是挂载到相应末节点上。
Mutable与const意思相反是可变的。
讲过一段的学习之后,终于做出了电子表格。
(图片不粘贴了,反正自己看)