首页 › 分类存档 › QT

Qt中设置widget背景颜色/图片的注意事项(使用样式表 setStyleSheet())

在Qt中设置widget背景颜色或者图片方法很多种:重写paintEvent() , 调色板QPalette , 样式表setStyleSheet等等。
继续阅读 »

setStyleSheet来设定窗口部件的样式

使用setStyleSheet来设置图形界面的外观:
QT Style Sheets是一个很有利的工具,允许定制窗口的外观,
此外还可以用子类QStyle来完成,他的语法很大比重来源于html的CSS,但是适用于窗口
继续阅读 »

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

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

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

QT 托盘类QSystemTrayIcon

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

多线程总结

进入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()本身是线程安全的。
继续阅读 »