10 2012 档案

摘要:我们知道,一般的,每个类只初始化自己的直接基类。但是在有虚基类存在的时候,这个初始化策略就会失败。因为如果使用这种初始化策略,就会可能多次初始化虚基类,类将沿着包含该虚基类的每个继承路径初始化。所以,为了解决这个重复初始化问题,需要从具有虚基类的类继承的类对初始化进行特殊处理。就是在虚派生中,由最底层派生类的构造函数初始化虚基类。 下面,我们来看一个例子,其继承关系是这样的,有三个基类,分别是人类Human、行为Behavior和非人类行为NonhumanFeature,男人Man和女人Woman公有虚拟继承自Human,人类行为HumanBehavior公有虚拟继承行为Behavior... 阅读全文
posted @ 2012-10-27 15:11 venow 阅读(571) 评论(0) 推荐(0)
摘要:单例模式定义: 只有一个实例,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。单例模式特点: 1、这个类只能有一个实例 2、这个类必须自行创建这个实例 3、这个类必须自行向整个系统提供这个实例单例模式解析: 下面是单例模式的UML图: 下面是简单代码实现://单例模式class Singleton{public: static Singleton* CreateInstance(); static void DestoryInstance(); ~Singleton... 阅读全文
posted @ 2012-10-27 10:47 venow 阅读(414) 评论(0) 推荐(0)
摘要:适配器模式定义: 将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。适配器模式分类: 1、类适配器模式 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。 2、对象适配器模式 在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。适配器模式解析: 引例:我有一台笔记本电脑,有一个鼠标,笔记本有4个USB接口,没有PS2接口;鼠标却是PS2接口的。我没有办法把鼠标插入笔记本电脑中,我又不能换一台有PS2接口的笔记本电脑,也不能去买一个有... 阅读全文
posted @ 2012-10-25 19:49 venow 阅读(431) 评论(0) 推荐(1)
摘要:参考<<C++GUIProgramming withQt4>>中文版第二版中的例子:城市距离。具体描述请看书本,主要重写继承自QAbstractTableModel的CityModel,该模型底层的数据是一个QStringList类型的对象和一个QVector<int>类型的对象。前者用于保存城市的名字,后者保存城市之间的距离。 citymodel.h文件:#ifndef CITYMODEL_H#define CITYMODEL_H#include <QAbstractTableModel>#include <QVector>#inc 阅读全文
posted @ 2012-10-20 09:39 venow 阅读(1123) 评论(0) 推荐(0)
摘要:参考<<C++GUIProgramming withQt4>>中文版第二版中的例子:货币汇率。具体描述请看书本,主要重写继承自QAbstractTableModel的CurrencyModel,该模型底层的数据使用一个QMap<QString, double>类型的数据,其中key的QString是货币名字,value的double是这种货币对美元的汇率。 currencymodel.h文件:#ifndef CURRENCYMODEL_H#define CURRENCYMODEL_H#include <QAbstractTableModel>#i 阅读全文
posted @ 2012-10-20 09:26 venow 阅读(705) 评论(0) 推荐(0)
摘要:参考<<C++GUIProgramming withQt4>>中文版第二版中的例子"DirectoryViewer",简单介绍QFileSystemModel的用法,QFileSystemModel 类似QDitModel,只不过Qt不推荐使用QDirModel,推荐是使用QFileSystemModel,该模型允许我们在view中显示操作系统的目录结构。 directoryviewer.h文件:#ifndef DIRECTORYVIEWER_H#define DIRECTORYVIEWER_H#include <QtGui/QDialog&g 阅读全文
posted @ 2012-10-18 20:14 venow 阅读(9793) 评论(0) 推荐(1)
摘要:参考<<C++GUIProgramming withQt4>>中文版第二版中的例子"ColorNamesDialog",简单介绍QSortFilterProxyModel的用法,QSortFilterProxyModel不能单独使用,它只是一个“代理”,真正的数据需要另外的一个model提供,而且它是用来排序和过滤的。 colornamesdialog.h文件:#ifndef COLORNAMESDIALOG_H#define COLORNAMESDIALOG_H#include <QtGui/QDialog>#include <Q 阅读全文
posted @ 2012-10-18 20:01 venow 阅读(9741) 评论(0) 推荐(0)
摘要:参考<<More Effective C++>>一书中的条款26:"限制某个class所能产生的对象数量",参照"一个用来计算对象个数的基类"中的代码,简单的将里面的代码实现。一个具有对象计数功能的基类,简单来说,就是完成一个base class,作为对象计数之用,并让诸如Printer之类的class继承它。更多内容请参考<<More Effective C++>>一书中的条款26,那里有很详细的描述,这里不再讲解。下面来看看代码是如何实现的。 代码如下:#include "stdafx.h&q 阅读全文
posted @ 2012-10-17 20:15 venow 阅读(549) 评论(0) 推荐(0)
摘要:参考<<C++GUIProgramming withQt4>>中文版第二版中的例子"TeamLeaderDialog",简单介绍QStringListModel的用法,说白了,QStringListModel就是封装了QStringList的model。QStringList是一种很常用的数据类型,它实际上是一个字符串列表。我们用QListView作为视图。对QStringListModel的修改都会实时的反应到视图QListView中。 teamleaderdialog.h文件:#ifndef TEAMLEADERDIALOG_H#define T 阅读全文
posted @ 2012-10-17 19:45 venow 阅读(8357) 评论(0) 推荐(0)
摘要:QTableWidget是一个显示结果类似一个表格,下面是它的简单使用。 main.cpp文件如下:#include <QtGui/QApplication>#include <QTextCodec>#include <QTableWidget>#include <QWidget>#include <QVBoxLayout>int main(int argc, char *argv[]){ QApplication a(argc, argv); QTextCodec::setCodecForTr(QTextCodec::codecFo 阅读全文
posted @ 2012-10-17 19:25 venow 阅读(3712) 评论(0) 推荐(0)
摘要:参考<<More Effective C++>>一书中的条款25:"将constructor和non-member function虚化",简单的将里面的代码实现。 constructor虚化:即virtual constructor,是某种函数,视其获得的输入,可产生不同的类型的对象。它在许多情况下有用,其中之一就是从磁盘(或网络或磁带等)读取对象信息。这里我是直接从文件中根据读取到字符的不同构造不同的对象。 non-member function虚化:即一个虚函数做实际工作,再写一个什么都不做的非虚函数,只负责调用虚函数。这里的虚函数即是prin 阅读全文
posted @ 2012-10-16 20:13 venow 阅读(959) 评论(2) 推荐(1)
摘要:QTreeWidget的显示效果与MFC的TreeCtrl控件是类似的,QTreeWidget与QTReeView的本质区别是QTreeWidget面向QTreeWidgetItem,而QTReeView是面向model的。 一个简单的小例子用来阐述QTreeWidget的简单使用。#include <QtGui/QApplication>#include <QtCore/QTextCodec>#include <QTreeWidget>#include <QWidget>#include <QHBoxLayout>int main( 阅读全文
posted @ 2012-10-16 19:54 venow 阅读(27668) 评论(0) 推荐(0)
摘要:这一节我们来介绍QListWidget的用法,QListWidget、QTreeWidget和QTableWidget都是将模型和视图结合起来,QListWidget将其显示效果与MFC的ListCtrl控件是一样一样的,下面是其简单的使用。就一个main.cpp#include <QtGui/QApplication>#include <QWidget>#include <QLabel>#include <QListWidget>#include <QHBoxLayout>#include <QIcon>int main 阅读全文
posted @ 2012-10-16 19:44 venow 阅读(47584) 评论(1) 推荐(0)
摘要:对生产者和消费者问题的另一个解决办法是使用QWaitCondition,它允许线程在一定条件下唤醒其他线程。其中wakeOne()函数在条件满足时随机唤醒一个等待线程,而wakeAll()函数则在条件满足时唤醒所有等待线程。 下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个main.cpp,文件如下:#include <QtCore/QCoreApplication>#include <QWaitCondition>#include <QThread>#include <QMutex>#include <iost 阅读全文
posted @ 2012-10-15 21:23 venow 阅读(13274) 评论(1) 推荐(1)
摘要:Qt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。 下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个main.cpp,文件如下:#include <QtCore/QCoreApplication>#include <QSemaphore>#include <QThread>#include 阅读全文
posted @ 2012-10-15 20:12 venow 阅读(28276) 评论(0) 推荐(1)
摘要:在Qt中使用剪贴板技术是非常简单的,直接使用QClipboard类就可以存取窗口系统的剪贴板。在Qt中是使用QMimeData类来表示剪贴板交换的数据,将一些常用的数据存入到剪贴板可以使用setText(),setImage()和setPixmap()函数。相对应的取数据可以使用text(),image()和pixmap()函数。 下面,通过一个简单的例子来说明这一点。从QWidget继承一个子类ClipboardWidget,该类的头文件clipboardwidget.h如下:#ifndef CLIPBOARDWIDGET_H#define CLIPBOARDWIDGET_H#incl... 阅读全文
posted @ 2012-10-15 19:47 venow 阅读(6020) 评论(1) 推荐(0)
摘要:Qt处理事件的第五种方式:"继承QApplication并重新实现notify()函数"。Qt调用QApplication来发送一个事件,重新实现notify()函数是在事件过滤器得到所有事件之前获得它们的唯一方法。事件过滤器使用更为便利。因为可以同时有多个事件过滤器。而notify()函数只有一个。 重新实现的QApplication类MyApplication的头文件myapplication.h如下:#ifndef MYAPPLICATION_H#define MYAPPLICATION_H#include <QApplication>#include & 阅读全文
posted @ 2012-10-11 20:30 venow 阅读(7985) 评论(0) 推荐(1)
摘要:Qt处理事件的第四种方式:"在QApplication中注册事件过滤器",如果一个事件过滤器被注册到程序中唯一的QApplication对象,应用程序中所有对象里的每一个事件都会在它们被送达其他事件事件过滤器之前,首先抵到这个eventFilter()函数。 在这里继承一个QWidget用来注册QApplication事件过滤器,MyWidget的头文件mywidget.h如下:#ifndef MYWIDGET_H#define MYWIDGET_H#include <QWidget>#include <QMouseEvent>class MyWid 阅读全文
posted @ 2012-10-11 20:00 venow 阅读(2303) 评论(0) 推荐(1)
摘要:Qt处理事件的第三种方式:"在QObject中注册事件过滤器",如果对象使用installEventFilter()函数注册了事件过滤器,目标对象中的所有事件将首先发给这个监视对象的eventFilter()函数。 mybutton.h文件如下:#ifndef MYBUTTON_H#define MYBUTTON_H#include <QPushButton>#include <QMouseEvent>class MyButton : public QPushButton{protected: bool event(QEvent *e);};#end 阅读全文
posted @ 2012-10-10 20:50 venow 阅读(6900) 评论(0) 推荐(0)
摘要:Qt处理事件的第二种方式:"重新实现QObject::event()函数",通过重新实现event()函数,可以在事件到达特定的事件处理器之前截获并处理他们。这种方法可以用来覆盖已定义事件的默认处理方式,也可以用来处理Qt中尚未定义特定事件处理器的事件。当重新实现event()函数时,如果不进行事件处理,则需要调用基类的event()函数。 mybutton.h的文件如下:#ifndef MYBUTTON_H#define MYBUTTON_H#include <QPushButton>#include <QMouseEvent>class MyBu 阅读全文
posted @ 2012-10-10 20:21 venow 阅读(2826) 评论(0) 推荐(1)
摘要:从这章开始,我将简单实现Qt事件处理的五种方式,这五种方式的实现都是基于一个自定义的Button,我将它命名为MyButton。由于我是刚学Qt,有什么讲的不对的地方,请指正,不胜感激。 首先来看第一种事件处理:"重新实现特定的事件处理器",这种方式最简单,派生于一个组件,重新实现它的事件处理。这里我主要实现的是mousePressEvent、mouseReleaseEvent以及mouseMoveEvent这三个事件处理,而实现的方式都差不多,不同在于设置Button显示的文本。 mybutton.h的头文件如下:#ifndef MYBUTTON_H#define MYB 阅读全文
posted @ 2012-10-10 20:02 venow 阅读(11902) 评论(1) 推荐(0)
摘要:#include <QtDebug>#include <QFile>#include <QTextStream>#define _TIME_ qPrintable (QTime::currentTime ().toString ("hh:mm:ss:zzz"))void Log(QtMsgType type, const char* msg){ QString qstrText; switch (type) { case QtDebugMsg: qstrText = QString("%1: %2").arg(_TIM 阅读全文
posted @ 2012-10-09 14:38 venow 阅读(4273) 评论(1) 推荐(0)
摘要:参考<<Effective C++>>一书中的条款10:"如果写了operator new就要同时写operatordelete",写了一个简易的内存池,说白了就是事先分配一块内存空间作为内存池,每次new对象的时候,直接从这里取内存,delete的时候将内存回收到内存池中,代码很简单,废话就不说了,直接看代码。#include "stdafx.h"#include <iostream>using namespace std;//内存池template<typename T> class pool{publ 阅读全文
posted @ 2012-10-08 19:31 venow 阅读(560) 评论(0) 推荐(0)