Qt学习记(python)

因为工作的需要,所以学习了pyqt真是一把心酸一把泪。因为细碎的知识点和api过多,为了防止遗忘,遂记录下来。(自己乃是初学,欢迎指出错误!)


~1:如果在托盘中想要点击图标实现重新显示,一般会用show()但是如果这时候失去焦点,主窗口被其他的软件(eg:浏览器)遮挡,点击图标不会生效。解决方法:在show()后面加上raise_()即可。点击这里查看详情。(补充:activateWindow()这个函数是widget类的,也可以使用..)


~1.5:QSystemTrayIcon这个是托盘图标类,这算是~1的补充,本来我对信号槽还有事件的理解就不是很清楚,所以出了一些问题。self.activated.connect(self.click),函数是我自己定义的,activated是qstrayicon类的signal,pyqt中貌似可以直接activated这个(算是动作,因为这个在icon发生状态变化的时候才会发送信号,事件点击导致状态发生变化应该是封装好的了)发动信号的动作来连接槽函数,下面是槽函数代码:

def click(self,res):
    if res == QSystemTrayIcon.Trigger:
        self._action_normal()
  # elif res == QSystemTrayIcon.QSystemTra yIcon.Context:
  #     pass

这里函数接收到了之前的信号参数QSystemTrayIcon::ActivationReason,在判断是点击的时候就调用显示正常的函数,当不是的时候就是右键请求contextMenu(这里不懂的是reason参数没有区分左右键的点击,都是trigger,而且不知道在是请求菜单的时候如何让它显示,所以我只好注释掉了elif,不过正好可以用,这个地方只能待以后再来补充了)


~2:在任务栏的图标点击app的子窗口,主窗口不会跟着一起出现,解决的方法是如下代码,让它不是子窗口,而是Qt.Tool。这样图标栏只会有一个图标了,也许有不用改变self的类型也可以的方法。这个就以后待补充了.

self.setWindowFlags(Qt.Tool | Qt.FramelessWindowHint)

~3:关于信号和槽

 @pyqtSlot(args)   
 def on_qobject_signal(self,args):

 self.connect(button,QtCore.SIGNAL('clicked()'),self, QtCore.SLOT('close()'))

上面两种是常见的信号槽的连接,其实本质上是一样的,都是指明了信号对象和信号,一来信号不能离开对象单独存在(单独存在的话,交互事件如何能emit信号呢?,二来每个对象可能有不同的信号(触发方式也可能不同)),但是对于对象默认信号,触发方式都是固定的,所以通过信号名称就能判断如何触发。有的时候还要带上参数,甚至通过参数来判断进行具体的操作。对信号槽还是不清晰的可以点击这里信号槽可以在两个任意对象之前进行通信(同意对象也可。)在我看来信号与其叫做信号,不如叫做状态的变化,发送的也是状态变化所代表的参数。(待续
// 信号连接槽函数和连接self的函数有什么不同?几个信号连接到一个函数也没什么问题,那么槽函数与普通函数在这里的区别是?
// 状态的改变也就是出发了不同的交互事件,每个交互事件所发送的信号大部分是不一样的.(如同systray类不同交互事件,左键单击,右键请求上下文菜单,双击发送的都是同一信号,但是参数是不一样的.对于每个不同的交互事件,发送相同的信号,带参数也没有问题,但是像qtabwidget也是同样的交互事件信号带了不同的参数,猜测应该是点击事件把位置参数传了进去.[此处不确定,欢迎指正.])


所有从 QObject 或其子类 ( 例如 Qwidget ) 派生的类都能够包含信号和槽。因为信号与槽的连接是通过 QObject 的 connect() 成员函数来实现的。

connect(sender, SIGNAL(signal), receiver, SLOT(slot));

其中 sender 与 receiver 是指向对象的指针,SIGNAL() 与 SLOT() 是转换信号与槽的宏。


意识到了自己对信号槽点击事件的不清楚,信号和槽的绑定不说,部件和信号的时候,信号一定要在类里面么?是一定是self.signal么?点击事件会发送带参数的信号么,如果可以,如何设置点击事件和信号之间的联系?(除了一些change,activated等等这样会自己检测变化而发出信号的类函数以外,自己可否重写事件来绑定信号来发送特定信号?)


~4:关于Qapplication,开发中遇到需求,需要app的地址栏图标可以来消息的时候可以像QQ一样闪烁,查了文档后发现需要调用函数void QApplication::alert(QWidget *widget, int msec = 0),对Qapplication详情可以看这里,然后可以调用qApp(为qapplication的指针)就可以了。

qApp.alert(self)

这里我不清楚的qapp和application的常用作用(待补充),需要再学习。而且让我意识到了我对项目的一些基本逻辑还是不清楚,包括建立session后的一系列判断。聊天,上传,下载,文件夹等于数据库的交互,还有mqtt。逻辑的真的是十分重要,记得用笔画出它的逻辑。


愿大家越过山丘!~

你可能感兴趣的:(pyqt5,python)