回答博文“PyQt5自定义无边框窗口“评论

博文链接: 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_())

如有其它错误和问题,望指出。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值