PYQT5:解决无边框窗体下,ComboBOX控件下拉异常


前言

 最近,在用pyqt5写窗口时,发现界面加入comboBOX控件后,下拉框无法正常启动,且导致窗体崩溃。

一、问题描述

 在GUI界面设置为无边框后,引入ComboBOX控件后,界面崩溃。

二、原因及解决方案

1.原因

 界面设置无边框后,通过鼠标的点击、释放、移动信号实现对于整个窗体的拖拽,这使得对于ComboBOX下拉拖拽与窗体移动事件无法区分,从而导致界面崩溃。

2.解决方案

原无边框后鼠标移动窗口代码如下:

# 无边框的拖动  
    def mouseMoveEvent(self, e: QtGui.QMouseEvent):  
            self._endPos = e.pos() - self._startPos
            self.move(self.pos() + self._endPos)

    def mousePressEvent(self, e: QtGui.QMouseEvent):
            if e.button() == QtCore.Qt.LeftButton:
                self._isTracking = True
                self._startPos = QtCore.QPoint(e.x(), e.y())

    def mouseReleaseEvent(self, e: QtGui.QMouseEvent):
            if e.button() == QtCore.Qt.LeftButton:
                self._isTracking = False
                self._startPos = None
                self._endPos = None

 在上述代码基础上,对于mousemove进行修改,由于无边框的目的主要是去自定义标题栏样式,因此限制鼠标拖动窗口仅在标题栏的坐标范围。 PYQT中提供了两个获得鼠标坐标的函数: e.pos() :对于主窗体的相对坐标 。e.x(),e.y() e.globalpos():对于电脑屏幕的相对坐标。e.globalx(),e.globaly() 由上述函数,获得当前界面标题栏的x,y坐标的min,max作为判定的边界。 最终修改为:

# 无边框的拖动  指定拖动标题区域移动 
    def mouseMoveEvent(self, e: QtGui.QMouseEvent):  # 重写移动事件
            if(e.x()>=title_x_min and e.x()<=title_x_max and e.y()>=title_y_min and e.y()<title_y_max):
                self._endPos = e.pos() - self._startPos
                self.move(self.pos() + self._endPos)

总结

 用上述解决思路后,CombBox在无边框界面中正常运行。  网上查找了很久,只看到一条相关提问,另一位博主采用的重写ComboBOX控件方法去解决的。如果上述解决思路无法适用,可在文末附上的链接拓展思路。🙂

参考

经验分享 程序员 微信小程序 职场和发展