首页 › 月度存档 › 7 月 2015

最小化到托盘并有图标闪烁效果

利用QSystemTrayIcon类来实现最小化托盘,并实现像QQ那样有消息闪烁图标的效果

但是程序运行到最后有个让我找了很久都没有找到的问题,就是当点击了图标的MessageBox()后,程序就自动退了了,并且exit with code 0
继续阅读 »

QT 托盘类QSystemTrayIcon

QSystemTrayIcon为应用程序在系统托盘中提供一个图标
关于系统托盘的介绍就节省了,但是并不是所有的系统都支持系统托盘,来检查一个系统是否支持系统托盘,使用静态函数QSystemTrayIcon::isSystemTrayAvailable()来检测来添加一个系统托盘入口,创建一个QSystemTrayIcon对象,调用setContexMenu()来为这个图标创建一个右键菜单,就像QQ上退出的那样的菜单。然后调用show()方法来使它在托盘区域显示,状态提示消息可以在任何时候使用showMessage()显示如果一个系统托盘在刚创建时候不可见,但是过会可见了,QSystemTrayIcon会自动在系统托盘添加一个应用程序的入口,前提是icon图标可见当用户点击了图标后,会发出信号activated()
继续阅读 »

MySQL字符集设置及字符转换(latin1转utf8)

在生成环境中,会经常碰到Mysql字符的设置问题,CU很多牛人都说过N次了,个人也总结下。

如果在应用开始阶段没有正确的设置字符集,在运行一段时间以后才发现存在不能满足要求需要调整,那么就需要进行字符集的修改。字符集的修改不能直接通过alter dataabase character set ***; 或者 alter table tablename character set ***; 命令进行,这两个命令都没有更新已有记录的字符集,而只是对新创建的表或者记录生效。

在笔者的数据库最为常用的是latin1、utf8,由于项目的整合,字符的要求也开始规范,统一为utf8,那么就需要把之前的latin1字符转换成才utf8格式,那样才不会出现乱码的情况。已有的记录的字符集调整,需要先将数据导出,经过适当的调整重新导入后才可完成。
继续阅读 »

多线程总结

进入run()函数后,新线程就开始运行,有自己的堆栈。

出了run()函数后,新建的线程就结束,并会发出信号,可以在另外一个线程中捕获,然后响应。、

currentThreadId()和 currentThread()分别会返回线程的ID号和线程对象指针。

最后在run()中调用exec()开始本线程的事件循环。

调用exit()或者quit()来退出线程。

QMutex加锁时候,其他的读和写都不能进行
继续阅读 »

QT工程中使用图片的三种方法

图片是一种资源,而在Qt中,对于资源的使用是有其独特的方式的!

①:一般来说:资源在内存中是用资源对象树来表示的,该树在程序启动时创建。

②:而对于资源而言:我们都是需要先将其加入到这棵树中才能加载到内存中并被程序使用!!

③:而将一个图片资源放到程序的资源对象树中是用函数QResource::registerResource()来实现的。亦即:要将资源向这颗资源对象树进行注册,这样才对在系统中new创建这个资“叶子”。
继续阅读 »

QT多线程续

可重入与线程安全

在Qt文档中,术语“可重入 ”与“线程安全 ”被用来说明一个函数如何用于多线程程序。假如一个类的任何函数在此类的多个不同的实例上,可以被多个线程同时调用,那么这个类被称为是“可重入”的。假如不同的线程作用在同一个实例上仍可以正常工作,那么称之为“线程安全”的。
继续阅读 »

QT多线程

Qt线程类

Qt 包含下面一些线程相关的类:
QThread 提供了开始一个新线程的方法
QThreadStorage 提供逐线程数据存储
QMutex   提供相互排斥的锁,或互斥量
QMutexLocker 是一个便利类,它可以自动对QMutex 加锁与解锁
QReadWriterLock 提供了一个可以同时读操作的锁
QReadLocker 与QWriteLocker 是便利类,它自动对QReadWriteLock 加锁与解锁
QSemaphore 提供了一个整型信号量,是互斥量的泛化
QWaitCondition 提供了一种方法,使得线程可以在被另外线程唤醒之前一直休眠。
继续阅读 »

Qt出现错误“undefined reference to `vtable for XXXXX.XXX”

如果新建一个类,继承了某个类,在这个类的头文件中式没有 Q_OBJECT宏声明的,如果想使用signal-slot信号,就需要添加Q_OBJECT宏,但是添加了这个宏后,就可能会出现这种错误,“undefined reference to vtable for LcdNumber”的编译错误

这是因为在Makefile里面没有这个类并没有Q_OBJECT信息,所以在执行Makefile时候也就没有moc xxx.h这条命令,最终导致连接失败。

知道了这个原因后,解决方法就很简答了,

重新运行qmake,生成Makefile,然后在编译就OK了

Qt跨线程信号和槽的连接

Qt支持三种类型的信号-槽连接:
1,直接连接,当signal发射时,slot立即调用。此slot在发射signal的那个线程中被执行(不一定是接收对象生存的那个线程)
2,队列连接,当控制权回到对象属于的那个线程的事件循环时,slot被调用。此slot在接收对象生存的那个线程中被执行
3,自动连接(缺省),假如信号发射与接收者在同一个线程中,其行为如直接连接,否则,其行为如队列连接。

连接类型可能通过以向connect()传递参数来指定。注意的是,当发送者与接收者生存在不同的线程中,而事件循环正运行于接收者的线程中,使用直接连接是不安全的。同样的道理,调用生存在不同的线程中的对象的函数也是不是安全的。QObject::connect()本身是线程安全的。
继续阅读 »

如何判断大端小端

端模式(Endian)的这个词出自Jonathan Swift书写的《格列佛游记》。这本书根据将鸡蛋敲开的方法不同将所有的人分为两类,从圆头开始将鸡蛋敲开的人被归为Big Endian,从尖头开始将鸡蛋敲开的人被归为Littile Endian。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。在计算机业Big Endian和Little Endian也几乎引起一场战争。在计算机业界,Endian表示数据在存储器中的存放顺序。下文举例说明在计算机中大小端模式的区别。
继续阅读 »