随笔分类 - Qt编程
摘要:参考<<C++GUIProgramming withQt4>>中文版第二版中的例子:城市距离。具体描述请看书本,主要重写继承自QAbstractTableModel的CityModel,该模型底层的数据是一个QStringList类型的对象和一个QVector<int>类型的对象。前者用于保存城市的名字,后者保存城市之间的距离。 citymodel.h文件:#ifndef CITYMODEL_H#define CITYMODEL_H#include <QAbstractTableModel>#include <QVector>#inc
阅读全文
摘要:参考<<C++GUIProgramming withQt4>>中文版第二版中的例子:货币汇率。具体描述请看书本,主要重写继承自QAbstractTableModel的CurrencyModel,该模型底层的数据使用一个QMap<QString, double>类型的数据,其中key的QString是货币名字,value的double是这种货币对美元的汇率。 currencymodel.h文件:#ifndef CURRENCYMODEL_H#define CURRENCYMODEL_H#include <QAbstractTableModel>#i
阅读全文
摘要:参考<<C++GUIProgramming withQt4>>中文版第二版中的例子"DirectoryViewer",简单介绍QFileSystemModel的用法,QFileSystemModel 类似QDitModel,只不过Qt不推荐使用QDirModel,推荐是使用QFileSystemModel,该模型允许我们在view中显示操作系统的目录结构。 directoryviewer.h文件:#ifndef DIRECTORYVIEWER_H#define DIRECTORYVIEWER_H#include <QtGui/QDialog&g
阅读全文
摘要:参考<<C++GUIProgramming withQt4>>中文版第二版中的例子"ColorNamesDialog",简单介绍QSortFilterProxyModel的用法,QSortFilterProxyModel不能单独使用,它只是一个“代理”,真正的数据需要另外的一个model提供,而且它是用来排序和过滤的。 colornamesdialog.h文件:#ifndef COLORNAMESDIALOG_H#define COLORNAMESDIALOG_H#include <QtGui/QDialog>#include <Q
阅读全文
摘要:参考<<C++GUIProgramming withQt4>>中文版第二版中的例子"TeamLeaderDialog",简单介绍QStringListModel的用法,说白了,QStringListModel就是封装了QStringList的model。QStringList是一种很常用的数据类型,它实际上是一个字符串列表。我们用QListView作为视图。对QStringListModel的修改都会实时的反应到视图QListView中。 teamleaderdialog.h文件:#ifndef TEAMLEADERDIALOG_H#define T
阅读全文
摘要: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
阅读全文
摘要:QTreeWidget的显示效果与MFC的TreeCtrl控件是类似的,QTreeWidget与QTReeView的本质区别是QTreeWidget面向QTreeWidgetItem,而QTReeView是面向model的。 一个简单的小例子用来阐述QTreeWidget的简单使用。#include <QtGui/QApplication>#include <QtCore/QTextCodec>#include <QTreeWidget>#include <QWidget>#include <QHBoxLayout>int main(
阅读全文
摘要:这一节我们来介绍QListWidget的用法,QListWidget、QTreeWidget和QTableWidget都是将模型和视图结合起来,QListWidget将其显示效果与MFC的ListCtrl控件是一样一样的,下面是其简单的使用。就一个main.cpp#include <QtGui/QApplication>#include <QWidget>#include <QLabel>#include <QListWidget>#include <QHBoxLayout>#include <QIcon>int main
阅读全文
摘要:对生产者和消费者问题的另一个解决办法是使用QWaitCondition,它允许线程在一定条件下唤醒其他线程。其中wakeOne()函数在条件满足时随机唤醒一个等待线程,而wakeAll()函数则在条件满足时唤醒所有等待线程。 下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个main.cpp,文件如下:#include <QtCore/QCoreApplication>#include <QWaitCondition>#include <QThread>#include <QMutex>#include <iost
阅读全文
摘要:Qt中的信号量是由QSemaphore类提供的,信号量可以理解为对互斥量功能的扩展,互斥量只能锁定一次而信号量可以获取多次,它可以用来保护一定数量的同种资源。acquire()函数用于获取n个资源,当没有足够的资源时调用者将被阻塞直到有足够的可用资源。release(n)函数用于释放n个资源。 下面通过一个典型用例:生产者和消费者,来实现这二者之间的同步。整个工程就一个main.cpp,文件如下:#include <QtCore/QCoreApplication>#include <QSemaphore>#include <QThread>#include
阅读全文
摘要:在Qt中使用剪贴板技术是非常简单的,直接使用QClipboard类就可以存取窗口系统的剪贴板。在Qt中是使用QMimeData类来表示剪贴板交换的数据,将一些常用的数据存入到剪贴板可以使用setText(),setImage()和setPixmap()函数。相对应的取数据可以使用text(),image()和pixmap()函数。 下面,通过一个简单的例子来说明这一点。从QWidget继承一个子类ClipboardWidget,该类的头文件clipboardwidget.h如下:#ifndef CLIPBOARDWIDGET_H#define CLIPBOARDWIDGET_H#incl...
阅读全文
摘要:Qt处理事件的第五种方式:"继承QApplication并重新实现notify()函数"。Qt调用QApplication来发送一个事件,重新实现notify()函数是在事件过滤器得到所有事件之前获得它们的唯一方法。事件过滤器使用更为便利。因为可以同时有多个事件过滤器。而notify()函数只有一个。 重新实现的QApplication类MyApplication的头文件myapplication.h如下:#ifndef MYAPPLICATION_H#define MYAPPLICATION_H#include <QApplication>#include &
阅读全文
摘要:Qt处理事件的第四种方式:"在QApplication中注册事件过滤器",如果一个事件过滤器被注册到程序中唯一的QApplication对象,应用程序中所有对象里的每一个事件都会在它们被送达其他事件事件过滤器之前,首先抵到这个eventFilter()函数。 在这里继承一个QWidget用来注册QApplication事件过滤器,MyWidget的头文件mywidget.h如下:#ifndef MYWIDGET_H#define MYWIDGET_H#include <QWidget>#include <QMouseEvent>class MyWid
阅读全文
摘要: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
阅读全文
摘要:Qt处理事件的第二种方式:"重新实现QObject::event()函数",通过重新实现event()函数,可以在事件到达特定的事件处理器之前截获并处理他们。这种方法可以用来覆盖已定义事件的默认处理方式,也可以用来处理Qt中尚未定义特定事件处理器的事件。当重新实现event()函数时,如果不进行事件处理,则需要调用基类的event()函数。 mybutton.h的文件如下:#ifndef MYBUTTON_H#define MYBUTTON_H#include <QPushButton>#include <QMouseEvent>class MyBu
阅读全文
摘要:从这章开始,我将简单实现Qt事件处理的五种方式,这五种方式的实现都是基于一个自定义的Button,我将它命名为MyButton。由于我是刚学Qt,有什么讲的不对的地方,请指正,不胜感激。 首先来看第一种事件处理:"重新实现特定的事件处理器",这种方式最简单,派生于一个组件,重新实现它的事件处理。这里我主要实现的是mousePressEvent、mouseReleaseEvent以及mouseMoveEvent这三个事件处理,而实现的方式都差不多,不同在于设置Button显示的文本。 mybutton.h的头文件如下:#ifndef MYBUTTON_H#define MYB
阅读全文
摘要:#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
阅读全文
浙公网安备 33010602011771号