pyqt4的可拖动窗口

Posted

技术标签:

【中文标题】pyqt4的可拖动窗口【英文标题】:Draggable window with pyqt4 【发布时间】:2011-10-31 14:42:30 【问题描述】:

只是一个简单的问题:我正在使用 pyqt4 来呈现一个简单的窗口。这是代码,我将整个内容发布出来以便于解释。

from PyQt4 import QtGui, QtCore, Qt
import time
import math

class FenixGui(QtGui.QWidget):

    def __init__(self):
            super(FenixGui, self).__init__()

        # setting layout type
        hboxlayout = QtGui.QHBoxLayout(self)
        self.setLayout(hboxlayout)

        # hiding title bar
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)

        # setting window size and position
        self.setGeometry(200, 200, 862, 560)
        self.setAttribute(Qt.Qt.WA_TranslucentBackground)
        self.setAutoFillBackground(False)

                # creating background window label
        backgroundpixmap = QtGui.QPixmap("fenixbackground.png")
        self.background = QtGui.QLabel(self)
        self.background.setPixmap(backgroundpixmap)
        self.background.setGeometry(0, 0, 862, 560)


        # fenix logo
        logopixmap = QtGui.QPixmap("fenixlogo.png")
        self.logo = QtGui.QLabel(self)
        self.logo.setPixmap(logopixmap)
        self.logo.setGeometry(100, 100, 400, 150)

def main():

    app = QtGui.QApplication([])
    exm = FenixGui()
    exm.show()
    app.exec_()


if __name__ == '__main__':
    main()

现在,您看到我在窗口中放置了一个背景标签。我希望可以通过拖动此标签在屏幕上拖动窗口。我的意思是:你点击标签,拖动标签,整个窗口就会出现在屏幕周围。这可能吗?我也接受不优雅的方式,因为如您所见,我隐藏了标题栏,因此如果我不通过背景标签使其可拖动,则无法拖动窗口。

希望我能正确解释我的问题 非常感谢!!

马泰奥·蒙蒂

【问题讨论】:

【参考方案1】:

您可以覆盖mousePressEvent() 和mouseMoveEvent() 以获取鼠标光标的位置并将您的小部件移动到该位置。 mousePressEvent 将为您提供从光标位置到小部件左上角的偏移量,然后您可以计算左上角的新位置应该是什么。您可以将这些方法添加到您的 FenixGui 类中。

def mousePressEvent(self, event):
    self.offset = event.pos()

def mouseMoveEvent(self, event):
    x=event.globalX()
    y=event.globalY()
    x_w = self.offset.x()
    y_w = self.offset.y()
    self.move(x-x_w, y-y_w)

【讨论】:

非常感谢,这正是我需要做的! 好的,再次抱歉:我添加了这些代码行来添加侦听器: self.connect(self.background,QtCore.SIGNAL("mousePressEvent()"), self.backgroundmousepressevent) self.connect (self.background,QtCore.SIGNAL("mouseMoveEvent()"), self.backgroundmousemoveevent) 但是什么也没发生,我什至不认为事件函数被调用了。我是不是做错了什么……? 我不相信 QWidget 使用这些信号。我认为你必须使用事件处理函数。如果在这些事件发生时您还想做其他事情,您可以将该代码添加到 mousePressEvent 和 'mouseMoveEvent' 函数中。 这种方法的问题是它不像大多数其他应用程序那样使用窗口管理器移动窗口。不知何故,您可以告诉 Qt 将未使用的点击事件传递给窗口管理器,但我不确定如何。

以上是关于pyqt4的可拖动窗口的主要内容,如果未能解决你的问题,请参考以下文章

WPF 窗口中的可拖动和自动调整用户控件

jQuery - 窗口滚动后的可拖动位置问题

PyQt4消息窗口

如何创建多个/级联窗口 PyQt4?

PyQt4:如何使用保留空间制作undercorated窗口

PyQt4简单的窗口程序