
C++ GUI Programming with Qt 4
iamdbl
一枚微小程序员
展开
-
10-3 实现自定义模型(Implementing Custom Models)
Qt预定义的类已经提供了方便处理和显示数据的方式。然而,一些数据源不能直接使用这些定义好的模型,这就需要创建自定义的模型,优化对这些数据的处理。在创建自定义模型之前,让我们首先回顾一下Qt的model/view结构的主要概念。在一个模型中每一个数据都有一个模型的索引(a model index)和一组属性,这些属性称为角色(roles),这些属性能够用任何类型的数据保存。在这一章的前几节最常用翻译 2008-10-26 10:39:00 · 8515 阅读 · 11 评论 -
6-5 可停靠控件和工具栏(Dock Widgets and Toolbars)
可停靠控件能够停靠在QMainWindow中或者作为一个独立窗口浮动。QMainWindow提供了四个可停靠控件的地方:上方,下方,左方,右方。Microsoft Visual Stadio程序和Qt Linguist程序使用大量的可停靠窗口实现更为复杂的用户界面。在Qt中,可停靠窗口是QDockWidget的一个实例。Figure 6.13. A QMainWindow with a翻译 2007-05-09 22:20:00 · 7205 阅读 · 1 评论 -
6-3 分隔控件(Splitters)
中英文对照Splitter handles(分隔条) 一个QSplitter控件中可以包含其他控件,这些控件被一个分隔条隔开,托拽这个分隔条,里面的控件的大小可以改变。QSplitter控件经常做为布局管理器使用,给用户提供更多的界面控制。QSplitter控件中的子控件总是按顺序自动并肩排列(或者上下排列)。相邻的控件之间有一个分隔条。下面是创建图6.7的窗体的代码:int main翻译 2007-04-26 20:44:00 · 11886 阅读 · 2 评论 -
5-4 双缓冲技术(Double Buffering)(4、私有函数的实现)
以下是私有函数的实现: void Plotter::updateRubberBandRegion(){ QRect rect = rubberBandRect.normalized(); update(rect.left(), rect.top(), rect.width(), 1); update(rect.left(), rect.top(), 1翻译 2007-04-24 22:11:00 · 3117 阅读 · 0 评论 -
5-4 双缓冲技术(Double Buffering)(3、事件处理函数)
以下是Plotter控件的事件处理函数部分 void Plotter::paintEvent(QPaintEvent * /* event */){ QStylePainter painter(this); painter.drawPixmap(0, 0, pixmap); if (rubberBandIsShown) { paint翻译 2007-04-24 22:06:00 · 3700 阅读 · 0 评论 -
5-4 双缓冲技术(Double Buffering)(2、公有函数实现)
#include #include using namespace std;#include "plotter.h"以上代码为文件的开头,在这里把std的名空间加入到当前的全局命名空间。这样在使用里的函数时,就不用前缀std::了,如可以直接使用函数floor(),而不用写成std::floor()。 Plotter::Plotter(QWidget *paren翻译 2007-04-24 21:59:00 · 4323 阅读 · 0 评论 -
6-4 滚动区域(Scrolling Areas)
英汉对照:viewport(视图)QScrollArea类提供了一个可以滚动的可视窗口和两个滚动条。如果我们想给一个控件加上一个滚动条,从QScrollArea继承会比设计我们自己的QScrollBar类实现滚动函数更简单。Figure 6.11. QScrollAreas constituent widgets 调用QScrollArea的setWidget()函翻译 2007-04-26 22:18:00 · 5595 阅读 · 0 评论 -
6-2 分组布局(Stacked Layouts)
QStackedLayout类把子控件进行分组或者分页,一次只显示一组或者一页,隐藏其他组或者页上的控件。QStackedLayout本身并不可见,对换页也不提供本质的支持。图6.5中的建头和黑灰色的框架是Qt Designer提供为了方便设计。为了方便起见,Qt还提供了类QStackedWidget,这个类的布局管理器为QStackedLayout。Figure 6.5. QStack翻译 2007-04-26 20:38:00 · 9816 阅读 · 1 评论 -
第六章序-布局管理(Chapter 6. Layout Management)
窗体上的所有的控件必须有一个合适的尺寸和位置。Qt提供了一些类负责排列窗体上的控件,主要有:QHBoxLayout,QVBoxLayout,QGridLayout,QStackLayout。(有时在译文中我会把这些类叫做布局管理类)这些类简单易用,无论在代码中还是用Qt Designer开发程序都能用到。 使用这些Qt布局管理类的另一个原因是,在程序改变字体,语言或者在不同的平台上运翻译 2007-04-24 22:16:00 · 3511 阅读 · 0 评论 -
5-4 双缓冲技术(Double Buffering)(5、类PlotSettings实现)
下面是PlotSettings的实现:PlotSettings::PlotSettings(){ minX = 0.0; maxX = 10.0; numXTicks = 5; minY = 0.0; maxY = 10.0; numYTicks = 5;}在构造函数中,把两个坐标轴的初始化为从0到10,分为5个刻度翻译 2007-04-24 22:13:00 · 2939 阅读 · 0 评论 -
6-1 排列窗体上的控件(Laying Out Widgets on a Form)
中英文对照:form(窗体),layout(布局或者排列,意思是进行窗体上控件的排列的过程,如大小位置等)absolute positioning(绝对位置定位),manual layout(手工布局), layout managers(布局管理器)Qt中有三种方式对窗体上的控件进行布局管理:绝对位置定位(absolute positioning),手工布局(manual layou翻译 2007-04-25 21:54:00 · 10566 阅读 · 1 评论 -
5-4 双缓冲技术(Double Buffering)(1、简介和源代码部分)
这一节实在是有些长,翻译完后统计了一下,快到2w字了。考虑到阅读的方便和网络的速度,打算把这节分为5个部分,第一部分为双缓冲技术的一个简介和所有的代码,如果能够看懂代码,不用看译文也就可以了。第二部分为Plotter控件的公有函数的实现,第三部分为Plotter的事件处理函数的实现,第四部分为Plotter控件的私有函数实现,第五部分为辅助类PlotSettings的实现。这里给出一些常翻译 2007-04-24 21:52:00 · 5465 阅读 · 1 评论 -
8-3 使用QImage进行高质量绘制(High-Quality Rendering with QImage)
在进行绘图时,我们经常要面对速度和效率两者之间矛盾。在X11和MacOsX系统上,在QWidget和QPixmap绘图要依赖平台自身的绘图引擎。在X11上,与X server的通信很少,Qt只是发送绘图命令而不是真正的绘图数据。这种画法的不足是Qt要收到平台自身绘图引擎的限制。在X11上,消除锯齿和支持分数坐标这些功能只有在Xserver上安装了XRender扩展才能实现;在MacO翻译 2007-07-24 21:50:00 · 16926 阅读 · 0 评论 -
8-2 坐标变换(Painter Transformations)
在QPainter的初始坐标系统中,点(0,0)位于绘图设备的左上角。X轴坐标向右递增,y轴向下递增,一个象素占据1×1的面积。需要说明的一点是一个象素的中心位于坐标的一半处。例如,左上角位于点(0,0)和点(1,1)之间区域的象素,它的中心位于(0.5,0.5)。如果我们使用QPainter绘制一个位置在(100,100)的象素,QPainter会在每个坐标值上增加0.5,以坐标(10翻译 2007-07-24 21:46:00 · 10916 阅读 · 0 评论 -
6-6 多文档界面(Multiple Document Interface)
一个主窗口区域内能够提供多个文档的程序称之为多文档程序,或者MDI程序。在Qt中,一个MDI程序是由QWorkspace类实现的,把QWorkspace做为中央控件,每一个文档窗口做为QWorkspace的子控件。MDI程序的惯例是提供一个window菜单,管理窗口的显示方式和当前打开的窗口列表。正在活动的窗口由选中记号标示。用户可以点击window菜单中窗口列表中的一个窗口把它激活。翻译 2007-05-17 21:51:00 · 6778 阅读 · 0 评论 -
第七章(序)事件处理-(Event Processingn)
事件是视窗系统或者Qt本身在各种不同的情况下产生的。当用户点击或者释放鼠标,键盘时,一个鼠标事件或者键盘事件就产生了。当窗口第一次显示时,一个绘制事件会产生告诉新可见的窗口绘制自己。很多事件是为了相应用户动作产生的,也有一些事件是由 系统独立产生的。在用Qt编程时,我们很少要考虑事件,当一些事件发生时,Qt控件会发出相应的信号。只有当实现用户控件或者需要修改现有控件的行为时,我们才需原创 2007-05-24 09:59:00 · 4016 阅读 · 2 评论 -
10-2 使用已有的模型类(Using Predefined Models)
Qt已经提供了一些可以和视图类配合使用的模型: QStringListModel 保存一系列字符串翻译 2008-05-06 21:52:00 · 6924 阅读 · 3 评论 -
10-1 使用数据视图便捷类(Using the Item View Convenience Classes)
通常使用Qt提供的数据视图便捷类(item view convenience class)要比定义一个模型简单的多,适合无需分离模型和视图的操作。在第四章中我们使用了QTableWidget和QTableWidgetItem实现了表格的功能。在这一节中,我们将介绍这些便捷类的使用。第一个例子是一个只读的QListWidget,第二个例子是一个可编辑的QTableWidget,第三个例子显示的是翻译 2008-04-20 11:05:00 · 10424 阅读 · 10 评论 -
第10章 数据视图类(Item View Classes)
很多Qt应用程序都允许用户查找,查看,编辑一个数据集中的一个具体数据。这些数据可能存在在一个文件中,或者在数据库中,也可能来自于网络。Qt提供的数据视图类能很好的处理这些数据。在Qt早先的版本中,数据视图控件中保存了一个数据集中的所有数据。用户在这个控件中对数据进行查找,编辑等操作,有时候还要把数据写回到数据源中。这种处理方式很容易使用,但是当数据量很大时就会影响程序性能,也不能将一个数据源用翻译 2008-04-20 10:53:00 · 6736 阅读 · 0 评论 -
9-3 处理剪贴板(Clipboard Handling)
很多应用程序使用Qt提供的剪贴板。例如:QTextEdit类提供了cut(),copy()和paste()槽函数,也能相应键盘的快捷键。客户程序只要编写很少的代码,甚至不写代码。如果我们正在开发自己的类,可以使用函数QApplication::clipboard()得到Qt的剪贴板,该函数返回的是一个QClipboard类型对象的指针。使用这个指针很容器对剪贴板进行读写访问,调用setText翻译 2008-03-04 21:53:00 · 7079 阅读 · 5 评论 -
9-2 支持自定义数据类型的托拽(Supporting Custom Drag Types)
在上一节的例子中,我们使用类QMimeData表示普通的MIME类型。调用QMimeData::setText()进行对文本的托拽,调用QMimeData::urls()得到托拽到url文本列表。如果我们想托拽普通的文本,HTML文本,图片,URLs,颜色等,都可以使用QMimeData类。但是 如果我们需要对自定义的类型进行托拽,就需要使用下面的方法:1. 用QByteArray翻译 2008-02-26 08:46:00 · 6119 阅读 · 4 评论 -
9-1 支持托拽功能(Enabling Drag and Drop)
9-1 支持托拽功能(Enabling Drag and Drop)名次解释:Drag:拖动,拉动,计算机中就是用鼠标拖动的过程Drop:滴下,落下,松开,计算机中就是鼠标拖动到某一个位置后放开左键的过程,Drag后总会Drop的。Drag和Drop是两个完全不同的动作。Qt中的控件可以作为拖动(drag)的地点,也可以作为松开(drop)的地点,或者同时作为拖动和松开的地点翻译 2007-10-16 21:48:00 · 8799 阅读 · 4 评论 -
8-5 用OpenGL绘图(Graphics with OpenGL)
8-5 用OpenGL绘图(Graphics with OpenGL)OpenGL是绘制2D和3D模型的标准API。在OpenGL基础上,Qt可以使用QtOpenGL模块绘制3D图形。本节假设您已经熟悉OpenGL。如果对OpenGL不了解,可以浏览http://www.opengl.org/。在Qt应用程序中使用OpenGL绘图非常简单:我们需要从QGLWidget继承自己的翻译 2007-10-08 22:24:00 · 10285 阅读 · 3 评论 -
8-4 打印(Printing)
在Qt中,打印与在QWidget,QPixmap或者QImage绘图很相似,一般步骤如下:1、创建绘图设备的QPrinter;2、弹出打印对话框,QPrintDialog,允许用户选择打印机,设置属性等;3、创建一个QPrinter的QPainter;4、用QPainter绘制一页;5、调用QPrinter::newPage(),然后绘制下一页;6、重复步骤4,5,直翻译 2007-10-08 22:12:00 · 11376 阅读 · 1 评论 -
8-1 用QPainter绘图(Painting with QPainter)
要在绘图设备(paint device,一般是一个控件)上开始绘制,我们只要创建一个QPainter,把绘图设备指针传给QPainter对象。例如:oid MyWidget::paintEvent(QPaintEvent *event){ QPainter painter(this); ...} 使用QPainter的draw…()函数我们可以绘制各种翻译 2007-05-29 21:52:00 · 32123 阅读 · 4 评论 -
第八章序 2D和3D图形系统(2D and 3D Graphics)
Qt的2D图形系统的基础是类QPainter。QPainter能够绘制各种几何图形(点,线,矩形,椭圆,圆弧,弦,扇形,多段线,贝赛尔曲线),还能绘制位图,图像和文字。此外QPainter还提供了很多高级功能:如平滑(平滑文字和几何图形的边界),透明度,渐变色,和矢量路径。QPainter还支持矩阵变换,使绘制2D图形和分辨率无关。 QPainter能够在“绘图设备”上绘图,如QWi翻译 2007-05-29 21:35:00 · 6167 阅读 · 0 评论 -
7-3 系统繁忙时的响应(Staying Responsive During Intensive Processing)
当我们调用QApplication::exec()时,Qt就开始了事件循环。启动时,Qt发出显示和绘制事件,把控件显示出来。然后,事件循环就开始了,不停检查是否有事件发生,然后把事件分派到程序中的QObject对象。一个事件正在处理时,其他的事件已经产生并加入到Qt的事件队列中,如果我们在处理某一个事件时花费了很多事件,这期间用户界面就不会有任何响应。例如,在程序保存文件时,窗口产生的事件翻译 2007-05-29 20:56:00 · 9506 阅读 · 0 评论 -
7-2 安装事件过滤器(Installing Event Filters)
Qt的事件模型一个强大的功能是一个QObject对象能够监视发送其他QObject对象的事件,在事件到达之前对其进行处理。假设我们有一个CustomerInfoDialog控件,由一些QLineEdit控件组成。我们希望使用Space键得到下一个QLineEdit的输入焦点。一个最直接的方法是继承QLineEdit重写keyPressEvent()函数,当点击了Space键时,调用focu翻译 2007-05-29 20:52:00 · 11077 阅读 · 3 评论 -
7-1 重写事件处理函数(Reimplementing Event Handlers)
在Qt中,一个事件是QEvent的子类的对象。Qt能够处理上百种类型的事件,每一类型的事件由一个枚举值确定。例如,对鼠标点击事件,QEvent::type()返回的值为QEvent::MouseButtonPress。很多情况下,一个QEvent对象不能保存有关事件的所有信息,例如,鼠标点击事件需要保存是左键还是右键触发了这个信息,还要知道事件发生时鼠标指针的位置,这些额外的信息储存翻译 2007-05-24 10:15:00 · 6563 阅读 · 0 评论 -
5-3 把自定义控件集成到Qt Designer中(Integrating Custom Widgets with Qt Designer)
要想在Qt Designer中使用自定义控件,必须要使Qt Designer能够知道我们的自定义控件的存在。有两种方法可以把新自定义控件的信息通知给Qt Designer:“升级”法和插件法。升级法最为简便快捷。顾名思义,升级法就是把Qt自有的控件进行升级改造一番。找一个Qt自有的控件,如果它和我们新加的自定义控件有着相似的API,那么只要在Qt Designer的对话框里面完成一些新控翻译 2007-04-10 10:51:00 · 5167 阅读 · 1 评论 -
5-2 从QWidget继承新类(Subclassing QWidget)
许多Qt的控件或者象HexSpinBox这些自定义控件都是现有的控件的一个组合。由Qt控件组合而成的用户控件可以用Qt Designer实现:1. 用模板“Widget”新建一个控件框架2. 在框架中加入需要的控件,并对控件进行布局3. 进行信号和槽连接4. 如果还需要更多的信号和槽,可以在继承QWidget和u翻译 2007-04-06 22:19:00 · 11897 阅读 · 0 评论 -
3-7 多文档(Multiple Documents)
现在我们开始实现Spreadsheet程序的main()函数:include include "mainwindow.h"int main(int argc, char *argv[]){ QApplication app(argc, argv); MainWindow mainWin; mainWin.show(); return app.翻译 2007-03-12 15:59:00 · 3294 阅读 · 0 评论 -
第三章 创建主窗口(Creating Main Windows)
第三章 创建主窗口(Creating Main Windows)这一章介绍如何用qt创建程序的主窗口。最后,读者能够生成一个有着全部菜单,工具条,状态条和许多对话框的完整的用户界面。应用程序的主窗口是用户界面的框架。SpreadSheet应用程序的主窗口如图所示。这个程序使用了第二章创建的Find,Go-to-Cell和Sort对话框。很多GUI应用程序都能够处理文件的读写,数据处理等翻译 2007-02-26 22:57:00 · 3391 阅读 · 0 评论 -
3-4 实现文件菜单(Implementing the File Menu)
3-4 实现文件菜单(Implementing the File Menu)在这一节,我们实现与文件菜单有关的槽函数和相关的私有函数,以使文件菜单可以工作,同时管理最近打开文件列表。void MainWindow::newFile(){ if (okToContinue()) { spreadsheet->clear(); setCurrentFile翻译 2007-03-04 21:02:00 · 4503 阅读 · 0 评论 -
3.1 继承QMainWindow类(Subclassing QMainWindow)
3.1 继承QMainWindow类一个应用程序的主窗口要从QMainWindow继承。我们在第二章看到的创建对话框的方法可以用来创建主窗口,QDialog和QMainWindow都是继承自QWidget类。主窗口可用Qt Designer创建。但是在这一章,我们使用c++代码实现。如果你喜欢使用可视化的工具,可以参考在线手册“Creating Main Windows in Qt D翻译 2007-02-27 20:29:00 · 5771 阅读 · 0 评论 -
2.6 Qt提供的控件和对话框类(Built-in Widget and Dialog Classes)
2.6 Qt提供的控件和对话框类(Built-in Widget and Dialog Classes)Qt提供了许多控件和对话框类,可以满足多种情况的需要。这一节将对它们进行介绍。有些特殊的控件如:QMenuBar,QToolBar和QStatusBar主窗口类控件在第三章介绍,QSplitter和QScrollArea在第六章介绍。大部分Qt提供的控件都会在本书中出现。在下面即将介绍的控件翻译 2007-02-26 10:24:00 · 4276 阅读 · 1 评论 -
2.3快速设计对话框(Rapid Dialog Design)
2.3快速设计对话框通常程序员们都是用c++源代码编写Qt应用程序,Qt也是很容易用来编写的。然而,许多程序员更喜欢用可视化的方法设计对话框,这样能更快速更容易对对话框进行修改。Qt Designer满足了程序员的这一要求,提供了可视化设计对话框的方法。它可以给一个应用程序提供全部或者部分对话框。用Qt Designer设计的对话框和用c++代码写成的对话框是一样的,可以用做一个常用的工具,并不对翻译 2007-02-24 20:54:00 · 5654 阅读 · 5 评论 -
第二章 创建对话框(Creating Dialogs)
在这章介绍如何创建Qt的对话框。对话框是程序和用户交互的桥梁,提供了程序和用户之间对话的一种方式。很多程序都是由一个主窗口,在这个主窗口中包含一个菜单条,多个工具条,和足够多的对话框。也有些程序本身就是一个对话框,直接相应用户的输入请求。本章中我们首先会用代码的方式创建我们的第一个对话框,然后用Qt Designer工具创建对话框。Qt Designer是一个可视化的工具,用它可以更快的创翻译 2007-02-07 16:56:00 · 4792 阅读 · 0 评论 -
从第二章开始规范翻译C++ GUI Programming with Qt 4
第一章就这样翻译完了,很快,因为简单。好多地方没有按照原书翻译。从第二章开始,我会按照原书的结构和标题进行翻译,但是因为语言和叙述的关系,不会逐字翻译,而是保持原书的内容不变。翻译这本书的主要目的是督促自己的学习。如果能够给其他人提供帮助,更是欣喜。原创 2007-02-07 16:47:00 · 4558 阅读 · 8 评论 -
1.3控件的几何排列-Laying Out Widgets
在这个小节中,我们说明在一个窗口中如何排列多个控件。学习利用signal和slot的方法使控件同步。程序要求用户通过spin box或者slider输入年龄。程序中使用了三个控件:QSpinBox,QSlider和QWidget。QWidget是这个程序的主窗口。QSpinBox和QSlider被放在QWidget中;他们是QWidget的children。反过来,我们也可以称QWidget是QS翻译 2007-02-07 16:35:00 · 5535 阅读 · 10 评论