Python 3.x 打开QComboBox会触发mouseMoveEvent,但不会触发MouseMesseEvent

Python 3.x 打开QComboBox会触发mouseMoveEvent,但不会触发MouseMesseEvent,python-3.x,pyqt5,mouseevent,qcombobox,Python 3.x,Pyqt5,Mouseevent,Qcombobox,在我的代码中,我有两个组合框,我特意设计了一个无框无边框窗口;所以我必须手动定义鼠标事件,以便在单击和拖动时移动窗口,并在边缘上调整大小。 如果没有组合框,它工作得很好,但不知何故,单击组合框打开它们只会触发mouseMoveEvent而不是MouseMessEvent,导致一个关于没有self.old_Pos的错误。如果我们取消注释init函数的最后三行,这个错误就消失了,但打开组合框时整个窗口都会被替换。我怎样才能克服这个问题 from PyQt5.QtWidgets import * fr

在我的代码中,我有两个组合框,我特意设计了一个无框无边框窗口;所以我必须手动定义鼠标事件,以便在单击和拖动时移动窗口,并在边缘上调整大小。 如果没有组合框,它工作得很好,但不知何故,单击组合框打开它们只会触发mouseMoveEvent而不是MouseMessEvent,导致一个关于没有self.old_Pos的错误。如果我们取消注释init函数的最后三行,这个错误就消失了,但打开组合框时整个窗口都会被替换。我怎样才能克服这个问题

from PyQt5.QtWidgets import *
from PyQt5 import QtCore
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class MainWindow(QWidget):
    switch_window = QtCore.pyqtSignal()
    def __init__(self):
        QWidget.__init__(self)
        self.combo1 = QComboBox()
        for i in range (0,10):
            self.combo1.addItem('Combo1 label %s' %str(i))
        self.combo2 = QComboBox()
        for i in range (0,15):
            self.combo2.addItem('Combo1 label %s' %str(i))
        main_layout = QVBoxLayout()
        layout = QHBoxLayout()
        layout.addWidget(self.combo1)
        layout.addWidget(self.combo2)
        # design title bar
        title_bar = QHBoxLayout()
        title_bar.setObjectName('HeaderBar')
        title_bar.setContentsMargins(0,0,0,0)
        title = QLabel('title bar')
        btn_size = 35
        btn_close = QPushButton("x")
        btn_close.clicked.connect(self.btn_close_clicked)
        btn_close.setFixedSize(btn_size,btn_size)
        btn_close.setStyleSheet("background-color: red;")
        btn_min = QPushButton("_")
        btn_min.clicked.connect(self.btn_min_clicked)
        btn_min.setFixedSize(btn_size, btn_size)
        btn_min.setStyleSheet("background-color: gray;")
        self.btn_max = QPushButton("+")
        self.btn_max.clicked.connect(self.btn_max_clicked)
        self.btn_max.setFixedSize(btn_size, btn_size)
        self.btn_max.setStyleSheet("background-color: gray;")
        title.setAlignment(Qt.AlignCenter)
        title_bar.addWidget(title)
        title_bar.addWidget(btn_min)
        title_bar.addWidget(self.btn_max)
        title_bar.addWidget(btn_close)
        main_layout.addLayout(title_bar)
        main_layout.addLayout(layout)
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setLayout(main_layout)
        #self.old_Pos = QPoint(0,0)
        #self.old_width = self.width()
        #self.old_height = self.height()
    def mousePressEvent(self, event):
        self.old_Pos = event.globalPos()
        self.old_width = self.width()
        self.old_height = self.height()
    def mouseMoveEvent(self, event):
        delta = QPoint (event.globalPos() - self.old_Pos)
        if (self.old_Pos.x() > self.x() + self.old_width - 10) or (self.old_Pos.y() > self.y() + self.old_height - 10):
            self.setFixedSize(self.old_width + delta.x(),self.old_height + delta.y())
        else:
            self.move(self.x() + delta.x(), self.y() + delta.y())
            self.old_Pos = event.globalPos()
    def btn_close_clicked(self):
        quit()
    def btn_max_clicked(self):
        if self.isMaximized():
            self.showNormal()
            self.btn_max.setText('+')
        else:
            self.showMaximized()
            self.btn_max.setText('R')
    def btn_min_clicked(self):
        self.showMinimized()        
app = QApplication([])
mainapp = MainWindow()
mainapp.show()
app.exec_()

我相信我解决了这个问题。 我们所要做的就是在mouseMoveEvent中定义
self.old\u Pos=None
mouseReleaseEvent
,并在mouseMoveEvent中放入
if self.old\u Pos:
语句。 代码如下:

from PyQt5.QtWidgets import *
from PyQt5 import QtCore
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class MainWindow(QWidget):
    switch_window = QtCore.pyqtSignal()
    def __init__(self):
        QWidget.__init__(self)
        self.combo1 = QComboBox()
        for i in range (0,10):
            self.combo1.addItem('Combo1 label %s' %str(i))
        self.combo2 = QComboBox()
        for i in range (0,15):
            self.combo2.addItem('Combo2 label %s' %str(i))
        main_layout = QVBoxLayout()
        layout = QHBoxLayout()
        layout.addWidget(self.combo1)
        layout.addWidget(self.combo2)
        # design title bar
        title_bar = QHBoxLayout()
        title_bar.setObjectName('HeaderBar')
        title_bar.setContentsMargins(0,0,0,0)
        title = QLabel('title bar')
        btn_size = 35
        btn_close = QPushButton("x")
        btn_close.clicked.connect(self.btn_close_clicked)
        btn_close.setFixedSize(btn_size,btn_size)
        btn_close.setStyleSheet("background-color: red;")
        btn_min = QPushButton("_")
        btn_min.clicked.connect(self.btn_min_clicked)
        btn_min.setFixedSize(btn_size, btn_size)
        btn_min.setStyleSheet("background-color: gray;")
        self.btn_max = QPushButton("+")
        self.btn_max.clicked.connect(self.btn_max_clicked)
        self.btn_max.setFixedSize(btn_size, btn_size)
        self.btn_max.setStyleSheet("background-color: gray;")
        title.setAlignment(Qt.AlignCenter)
        title_bar.addWidget(title)
        title_bar.addWidget(btn_min)
        title_bar.addWidget(self.btn_max)
        title_bar.addWidget(btn_close)
        main_layout.addLayout(title_bar)
        main_layout.addLayout(layout)
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setLayout(main_layout)
        self.work_with_combo = True
        self.old_Pos = None
    def mousePressEvent(self, event):
        self.old_Pos = event.globalPos()
        self.old_width = self.width()
        self.old_height = self.height()
    def mouseMoveEvent(self, event):
        if self.old_Pos:
            delta = QPoint (event.globalPos() - self.old_Pos)
            if (self.old_Pos.x() > self.x() + self.old_width - 10) or (self.old_Pos.y() > self.y() + self.old_height - 10):
                self.setFixedSize(self.old_width + delta.x(),self.old_height + delta.y())
            else:
                self.move(self.x() + delta.x(), self.y() + delta.y())
                self.old_Pos = event.globalPos()
    def mouseReleaseEvent(self, event):
        self.old_Pos = None
    def btn_close_clicked(self):
        quit()
    def btn_max_clicked(self):
        if self.isMaximized():
            self.showNormal()
            self.btn_max.setText('+')
        else:
            self.showMaximized()
            self.btn_max.setText('R')
    def btn_min_clicked(self):
        self.showMinimized()        
app = QApplication([])
mainapp = MainWindow()
mainapp.show()
app.exec_()

我一直在寻找这个解决方案。非常感谢您发布了解决方案。对我来说真是太好了

对于仅使用Qt Creator的任何人,以下是我使用的最终代码:

//Declare oldPos in .h private
QPoint oldPos = QPoint();

void GiftCardDialog::mousePressEvent(QMouseEvent* event) {
    oldPos = event->globalPos();
}

void GiftCardDialog::mouseReleaseEvent(QMouseEvent *event) {
    (void)event;
    oldPos = QPoint();
}

void GiftCardDialog::mouseMoveEvent(QMouseEvent* event) {
    if(!oldPos.isNull()) {
        QPoint delta = event->globalPos() - oldPos;
        if(oldPos.x() > this->x() + this->width() - 10
                || oldPos.y() > this->y() + this->height() - 10) {

        } else {
            move(this->x() + delta.x(), this->y() + delta.y());
            oldPos = event->globalPos();
        }
    }
}

对不起,我听不懂你的描述。一切都是一样的,没有错误。@S.Nick,让我用gif给你看一下:。我知道问题出在gif显示的第46行。但除了如何解决这个问题之外,我的问题是,为什么打开组合框会触发mouseMoveEvent而不是MouseMesseEvent。@ShoaibMirzaei什么版本的PyQt5?我认为这是一个只能在Windows中看到的错误,而在另一个操作系统中它没有被观察到(例如,在Linux中的PyQt5 5.13中,我没有观察到您所指出的),我还记得另一个用户提出了同样的问题,并且可以解决它,我建议您在SO中进行搜索。@ShoaibMirzaei我认为这就是错误:
Windows 7
PyQt5 5.12.1
-一切正常。