如何在 python 中移动 PyQt 中的中央小部件
How to move the central widget in PyQt in python
我正在使用 PyQt5,我知道你可以使用 move() 使按钮等其他东西移动到其他位置,但在这种情况下这对我不起作用,但是当我为某些设置位置时它起作用了我之前制作的按钮。
出于某种原因,当我尝试让我的小部件 DrawImage 转到 window 的某个部分时,它从来没有这样做,而是停留在左上角。
这个 DrawImage 将被插入到另一个 class 我已经设置好 window 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:
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_()
QMainWindow
预设布局如下图:
此布局用于设置toolbar
、menubar
、statusbar
、dockwidget
和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()
您正在使用的 QMainWindow class 有一个特殊的 "central" 小部件概念。听起来您宁愿让主小部件不是中央小部件,而是 "Dock widget"。您需要熟悉 QMainWindow 和 QWidgets 提供的布局。
我正在使用 PyQt5,我知道你可以使用 move() 使按钮等其他东西移动到其他位置,但在这种情况下这对我不起作用,但是当我为某些设置位置时它起作用了我之前制作的按钮。
出于某种原因,当我尝试让我的小部件 DrawImage 转到 window 的某个部分时,它从来没有这样做,而是停留在左上角。
这个 DrawImage 将被插入到另一个 class 我已经设置好 window 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:
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_()
QMainWindow
预设布局如下图:
此布局用于设置toolbar
、menubar
、statusbar
、dockwidget
和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()
您正在使用的 QMainWindow class 有一个特殊的 "central" 小部件概念。听起来您宁愿让主小部件不是中央小部件,而是 "Dock widget"。您需要熟悉 QMainWindow 和 QWidgets 提供的布局。