pyqt5

pyqt5

这两个礼拜做一个报文发送的后台守护程序,用到了pyqt5做用户界面。

1.简单窗口

 

2.ui分离

这个就不写了,网上多的是。用QtDesginer生成ui文件,然后用pyuic5转换成ui类的py文件,在主程序中导入该文件并派生ui类。

3.信号与槽的参数

在定义信号的时候,就要确定信号带的参数类型与个数。 比如说:

sig_no_param = pyqtSignal()

sig_one_param = pyqtSignal(int)

sig_two_param = pyqtSingal(int, str)

与这些信号连接的槽函数也需要接受相应的参数。

但是有一种情况,信号的参数与槽函数的参数不一致怎么办?比如说信号是不带参数的,但是想将其连接到一个带参数的函数。要解决这个问题,可以考虑用lambda表达式。

4.将日志输出到文本框

那么在窗口类就可以通过给logger添加该handler来输出到文本框ui。

 

5.ui是线程不安全的

不要在子线程试图改变ui,应该在子线程中发射信号,由主线程的槽函数捕获后修改ui状态。

比如说主线程有一个display_logger是绑定到QTextBrower控件的日志对象,将日志输出到该控件显示。

如果子线程也想输出日志到ui控件上,非多线程的做法是可以通过display_logger.getChild()来获得一个子logger输出日志。而多线程的情况下,这样做虽然也可以正常输出,但是在控制台会发现有QT的报错:

所以正确做法应该是在子线程定义信号:

主线程将该信号连接到Logger的log(lvl, msg)函数:

 

6.窗口最小化,由系统托盘退出

7.设置QTextEdit focus无边框

程序的用户界面中用到了QTextBrowser以及QLineEdit,每当控件聚焦的时候,都会出现蓝色的边框,特别扰人。查了网上说的各种办法,最多人说的是设置focus事件的qss。

但这其实还有一点问题,因为我们不知道这些输入框在未聚焦时候的border-color默认值是多少,#66666只是我大概模拟的,细看还是有颜色区别的。而且这并没有阻止QT给聚焦输入框画蓝色边框的动作,只是被这个qss给覆盖了罢了。

实际上,QTextBrowser会有聚焦时候的蓝色边框,是因为它继承的QFrame类的默认frameShape=QFrame::StyledPanel。可以在qtdesigner上将其改为QFrame::Box。或者在代码中调用qtextbrowser.setFrameShape(QFrame.Box)即可,这样就不会在聚焦的时候给QTextEdit画上蓝色边框了。

而对于QLineEdit,它并没有继承QFrame类,但是它有一个frame属性,表示是否要给自己绘制边框,默认是打开的。可以通过QLineEdit.setFrame(False)将其关闭,但是这样该lineedit就没有边框了,只有一块白色,可以通过qss再给他设置border,这样它的border就固定了,不会因为聚焦而出现高亮的蓝色边框。

8. Single Instance QApplication

可以使用QT的共享内存来实现程序的单实例运行。当程序运行时候,先申请一段名字为key的共享内存,如果此时系统已经存在该名字的共享内存,说明已经有一个该程序的实例在运行,提示用户。

9. 使用系统默认图标

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注