博文链接: https://blog.csdn.net/zizle_lin/article/details/106164600
有个评论说在拖拽窗口会导致下拉框崩溃。也给出了例子https://ask.csdn.net/questions/1100233
我试着运行了该例子,只有一种情况会崩溃:在操作下拉框的同时拖拽窗口就会使程序崩溃。(如果有别的情况崩溃,望指出!)
个人觉得这类问题应该很少见,不至于在操作下拉框的时候还要拖拽窗口。但非要这么做,我想到个办法,重写QCombobox在操作下拉时禁用拖拽(试了禁止鼠标穿透,没成功.)
稍微修改了例子的代码如下:
# _*_ coding:utf-8 _*_
# @File : question.py
# @Time : 2020-10-21 08:11
# @Author: zizle
from PyQt5.Qt import *
from PyQt5.QtCore import *
class Combobox(QComboBox):
enter = pyqtSignal()
leave = pyqtSignal()
def __init__(self, *args, **kwargs):
super(Combobox, self).__init__(*args, **kwargs)
def enterEvent(self, *args, **kwargs):
self.enter.emit()
def leaveEvent(self, *args, **kwargs):
self.leave.emit()
class AboutUsDialog(QDialog):
def __init__(self, parent=None):
super(AboutUsDialog, self).__init__(parent)
self.is_drag = True
self.setWindowFlags(Qt.FramelessWindowHint | Qt.Dialog)
self.setGeometry(120, 0, 200, 120)
self.co = Combobox(self)
self.co.addItems(["test21","testf"])
self.co.enter.connect(self.mouse_enter_co)
self.co.leave.connect(self.mouse_leave_co)
def mouse_enter_co(self):
self.is_drag = False
def mouse_leave_co(self):
self.is_drag = True
def mousePressEvent(self, event):
if self.is_drag and event.button() == Qt.LeftButton:
self.dragPosition = event.globalPos() - self.frameGeometry().topLeft()
QApplication.postEvent(self, QEvent(174))
event.accept()
def mouseMoveEvent(self, event):
if self.is_drag and event.buttons() == Qt.LeftButton:
self.move(event.globalPos() - self.dragPosition)
event.accept()
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
aboutus = AboutUsDialog()
aboutus.show()
sys.exit(app.exec_())
如有其它错误和问题,望指出。