首页 > 解决方案 > 如何在 python 中移动 PyQt 中的中心小部件

问题描述

我正在使用 PyQt5,我知道您可以使用 move() 将按钮等其他东西移动到其他位置,但在这种情况下这对我不起作用,但是当我为我制作的一些按钮设置位置时它会起作用早些时候。

出于某种原因,当我尝试让我的小部件 DrawImage 转到窗口的某个部分时,它从不这样做,而是停留在左上角。

这个 DrawImage 将被插入到另一个类中,该类设置将放置 DrawImage 的窗口。关于如何使它工作的任何想法?

import PyQt5
import sys
#from PyQt5 import QtCore, QtGui, QtWidgets
#from PyQt.QtWidgets import QApplication, QWidget
from PyQt5 import QtWidgets  
from PyQt5 import QtGui, QtCore


class Homework4(QtWidgets.QMainWindow):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.setup()

    def setup(self):
        self.setGeometry(200, 200, 400, 200)
        self.setWindowTitle('Triangle Peg Game')
        self.setToolTip("Play the triangle peg game!")
        self.Left_button = LeftBtn(self)
        self.Right_button = RightBtn(self)
        self.Top_Button = TopBtn(self)
        self.Down_Button = DownBtn(self)

        #setting the background color
        p = self.palette()
        p.setColor(self.backgroundRole(), QtCore.Qt.gray)
        #p.setColor(self.backgroundRole(), Qt.gray)
        self.setPalette(p)
        self.setAutoFillBackground(True)

        #Central Widget
        self.Draw = DrawImage(self)   #############
        self.setCentralWidget(self.Draw)

        self.show()



class LeftBtn(QtWidgets.QPushButton):
    def __init__(self, parent):
        QtWidgets.QPushButton.__init__(self, parent)
        self.setText("Left")
        self.resize(40,200)
        self.move(0,0)
        #self.clicked.connect(QtWidgets.qApp.quit)    #bind the button to an event slot

class RightBtn(QtWidgets.QPushButton):
    def __init__(self, parent):
        QtWidgets.QPushButton.__init__(self, parent)
        self.setText("Right")
        self.resize(40,200)
        self.move(360,0)
        #self.clicked.connect(QtWidgets.qApp.quit) 

class TopBtn(QtWidgets.QPushButton):
    def __init__(self, parent):
        QtWidgets.QPushButton.__init__(self, parent)
        self.setText("Top")
        self.resize(320,20)
        self.move(40,0)
        #self.clicked.connect(QtWidgets.qApp.quit) 

class DownBtn(QtWidgets.QPushButton):
    def __init__(self, parent):
        QtWidgets.QPushButton.__init__(self, parent)
        self.setText("Down")
        self.resize(320,20)
        self.move(40,180)
        #self.clicked.connect(QtWidgets.qApp.quit) 

这是我的 DrawImage 类:

class DrawImage(QtWidgets.QWidget):  
    def __init__(self, parent):
        QtWidgets.QWidget.__init__(self, parent)
        self.move(200,50)
        self.setFizedSize(100,100)  

    def paintEvent(self, event):              #use to draw on the canvas
        paint = QtGui.QPainter()
        paint.begin(self)

        paint.setRenderHint(QtGui.QPainter.Antialiasing)
        # make a white drawing background
        paint.setBrush(QtCore.Qt.white)
        paint.drawRect(event.rect())
        # for circle make the ellipse radii match
        radx = 10
        rady = 10
        # draw red circles
        paint.setPen(QtCore.Qt.red)
        for k in range(12, 22, 1):    # 125, 220, 10
            center = QtCore.QPoint(k, k)
            # optionally fill each circle yellow
            paint.setBrush(QtCore.Qt.yellow)
            paint.drawEllipse(center, radx, rady)
        paint.end()

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main_window = Homework4()     #create an object of Homework4, which contains the main window
    app.exec_()

标签: pythonpyqtpyqt5qmainwindow

解决方案


QMainWindow具有如下所示的预设布局:

在此处输入图像描述

此布局用于设置toolbar, menubar, statusbar, dockwidgets 和centralwidget. 布局处理小部件的位置和大小,这就是生成此错误的原因。解决方案是将另一个小部件设置为中心小部件,而您DrawImage是这个新小部件的儿子。

class Homework4(QtWidgets.QMainWindow):
    def __init__(self):
        QtWidgets.QMainWindow.__init__(self)
        self.setup()

    def setup(self):
        self.setGeometry(200, 200, 400, 200)
        self.setWindowTitle('Triangle Peg Game')
        self.setToolTip("Play the triangle peg game!")
        self.Left_button = LeftBtn(self)
        self.Right_button = RightBtn(self)
        self.Top_Button = TopBtn(self)
        self.Down_Button = DownBtn(self)

        #setting the background color
        p = self.palette()
        p.setColor(self.backgroundRole(), QtCore.Qt.gray)
        #p.setColor(self.backgroundRole(), Qt.gray)
        self.setPalette(p)
        self.setAutoFillBackground(True)

        #Central Widget
        central_widget = QtWidgets.QWidget()
        self.Draw = DrawImage(central_widget)
        self.setCentralWidget(central_widget)

        self.show()

推荐阅读