【问题标题】:How to move window when dragging frame pyqt5 [duplicate]拖动框架pyqt5时如何移动窗口[重复]
【发布时间】:2020-12-19 08:41:31
【问题描述】:

我想在 pyqt5 中使用 QFrame 拖动窗口。 尝试函数 mouseMoveEvent 但我收到有关 move() 的错误 添加mouseMoveEvent函数进行移动但不起作用并返回错误:

Traceback(最近一次调用最后一次):文件“main.py”,第 47 行,在 鼠标移动事件 self.move(self.pos() + event.globalPos() - self.dragPos) AttributeError: 'Ui_MainWindow' 对象没有属性 'move'

这是我使用 pyuic5 从 ui 文件创建到 py 的示例代码

ma​​in.py

# -*- coding: utf-8 -*-


from PyQt5 import QtCore, QtGui, QtWidgets
import t

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        
        # Remove title bar
        MainWindow.setWindowFlag(QtCore.Qt.FramelessWindowHint) 
        MainWindow.resize(800, 450)
        MainWindow.setMinimumSize(QtCore.QSize(800, 450))
        MainWindow.setMaximumSize(QtCore.QSize(800, 450))
        MainWindow.setStyleSheet("QMainWindow {background: transparent; }\n"
"QToolTip {\n"
"    color: #ffffff;\n"
"    background-color: rgba(27, 29, 35, 160);\n"
"    border: 1px solid rgb(40, 40, 40);\n"
"    border-radius: 2px;\n"
"}")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setGeometry(QtCore.QRect(0, 0, 800, 450))
        self.frame.setStyleSheet("QFrame {\n"
"background-image: url(:/1/welcome.jpg);\n"
"}")
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        # Connect frame to mouseMoveEvent
        self.frame.mouseMoveEvent = self.mouseMoveEvent
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
    

    def mouseMoveEvent(self, event):
        if event.buttons() == QtCore.Qt.LeftButton:
            self.move(self.pos() + event.globalPos() - self.dragPos)
            self.dragPos = event.globalPos()
            event.accept()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python python-3.x qt pyqt5


    【解决方案1】:

    不要修改 Qt Designer 生成的代码,而是创建另一个继承的类 来自适当的小部件并使用初始类来填充它。

    from PyQt5 import QtCore, QtGui, QtWidgets
    #import t
    
    class Ui_MainWindow(object):
        def setupUi(self, MainWindow):
            MainWindow.setObjectName("MainWindow")
            
            # Remove title bar
            MainWindow.setWindowFlag(QtCore.Qt.FramelessWindowHint) 
            MainWindow.resize(512, 450)
            MainWindow.setMinimumSize(QtCore.QSize(512, 450))
            MainWindow.setMaximumSize(QtCore.QSize(512, 450))
            MainWindow.setStyleSheet("QMainWindow {background: transparent; }\n"
    "QToolTip {\n"
    "    color: #ffffff;\n"
    "    background-color: rgba(227, 29, 35, 160);\n"
    "    border: 1px solid rgb(40, 40, 40);\n"
    "    border-radius: 2px;\n"
    "}")
            self.centralwidget = QtWidgets.QWidget(MainWindow)
            self.centralwidget.setObjectName("centralwidget")
            self.frame = QtWidgets.QFrame(self.centralwidget)
            self.frame.setGeometry(QtCore.QRect(0, 0, 512, 512))
            self.frame.setStyleSheet("QFrame {\n"
    "background-image: url(lena.jpg);\n"
    "}")
            self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
            self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
            self.frame.setObjectName("frame")
            # Connect frame to mouseMoveEvent
            self.frame.mouseMoveEvent = self.mouseMoveEvent
            MainWindow.setCentralWidget(self.centralwidget)
    
            self.retranslateUi(MainWindow)
            QtCore.QMetaObject.connectSlotsByName(MainWindow)
    
        def retranslateUi(self, MainWindow):
            _translate = QtCore.QCoreApplication.translate
            MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        
    
    #    def mouseMoveEvent(self, event):
    #        if event.buttons() == QtCore.Qt.LeftButton:
    #            self.move(self.pos() + event.globalPos() - self.dragPos)
    #            self.dragPos = event.globalPos()
    #            event.accept()
    
    
    class MyWin(QtWidgets.QMainWindow, Ui_MainWindow):
        def __init__(self):
            super().__init__()
            self.setupUi(self)
            self.dragPos = QtCore.QPoint()
            
        def mousePressEvent(self, event):                                 # +
            self.dragPos = event.globalPos()
            
        def mouseMoveEvent(self, event):                                  # !!!
            if event.buttons() == QtCore.Qt.LeftButton:
                self.move(self.pos() + event.globalPos() - self.dragPos)
                self.dragPos = event.globalPos()
                event.accept()        
            
    
    if __name__ == "__main__":
        import sys
        app = QtWidgets.QApplication(sys.argv)
    #    MainWindow = QtWidgets.QMainWindow()
    #    ui = Ui_MainWindow()
    #    ui.setupUi(MainWindow)
    #    MainWindow.show()
        w = MyWin()
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 我可以删除黑色背景窗口吗?你有这个想法吗?
    • 我找到了:MainWindow.setAttribute(QtCore.Qt.WA_TranslucentBackground)
    猜你喜欢
    • 1970-01-01
    • 2016-10-09
    • 2013-06-06
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多