【问题标题】:PyQT - Positioning and Displaying a Custom WidgetPyQT - 定位和显示自定义小部件
【发布时间】:2011-02-25 06:14:16
【问题描述】:

我正在尝试使用 PyQT 来定位和显示自定义小部件。到目前为止,我有一个小部件和我的窗口。我已经成功地通过布局显示小部件,但是,我有兴趣在 show() 之前使用 .move(x,y,) 来定位我的小部件。到目前为止,我的代码如下:

import sys, random
from PyQt4 import QtGui, QtCore

# Robot Widget
class RobotLink(QtGui.QWidget):
    def __init__(self, parent, x, y, width, height, fill):
        super(RobotLink, self).__init__(parent)
        self._x        = x
        self._y        = y
        self._width    = width
        self._height   = height
        self._fill     = fill
        self._rotation = 0

    def paintEvent(self, e):
        painter = QtGui.QPainter()
        painter.begin(self)
        self.drawLink(painter)
        painter.end()

    def drawLink(self, painter):
        painter.setPen(QtGui.QColor(0, 0, 0))
        painter.setBrush(self._fill)
        painter.drawEllipse(self._x, self._y, self._width, self._height)

# Window
class Window(QtGui.QWidget):
    # Default Constructor, sets up the window GUI
    def __init__(self):
        super(Window, self).__init__()
        self.initUI()

    def initUI(self):
        self._link1 = RobotLink(self, 225, 400, 30, 150, QtCore.Qt.DiagCrossPattern)
        self._link2 = RobotLink(self, 0, 320, 30, 100, QtCore.Qt.Dense5Pattern)
        self._link3 = RobotLink(self, 225, 260, 30, 75, QtCore.Qt.Dense2Pattern)

        self._link1.move(0, 0)
        self._link1.show()

        self.setGeometry(300, 300, 800, 600)
        self.setWindowTitle("CSCE 452 - PaintBot")


    def paintEvent(self, e):
        super(Window, self).paintEvent(e)
        painter = QtGui.QPainter()
        painter.begin(self)
        self.drawBoundingBoxes(painter)
        painter.end()

    # Draws the boxes that define the robots workspace and
    # the control panel
    def drawBoundingBoxes(self, painter):
        color = QtGui.QColor(0, 0, 0)
        color.setNamedColor("#cccccc")
        painter.setPen(color)

        # Draw the robot workspace
        painter.setBrush(QtGui.QColor(255, 255, 255))
        painter.drawRect(10, 10, 500, 578)

        # Draw the control panel workspace
        painter.setBrush(QtGui.QColor(150, 150, 150))
        painter.drawRect(520, 10, 270, 578)

        # Draws the slider 'base'
        painter.setPen(QtGui.QColor(0, 0, 0))
        painter.drawLine(100, 570, 400, 570)

    def changeValue(self, value):
        self.wid.emit(QtCore.SIGNAL("updateRobot(int)"), value)
        self.wid.repaint()

# Setup the Window, and the Robot
app = QtGui.QApplication(sys.argv)
win = Window()
win.show()
app.exec_()

知道如何在没有布局的情况下附加我的小部件、定位它并让它显示在我的窗口内吗?

【问题讨论】:

    标签: python qt pyqt


    【解决方案1】:

    我在您的代码中注意到的几件事:

    1. 您实际上不需要为自定义小部件定义存储 x、y、宽度和高度。只需调用 setGeometry 并将坐标传递给构造函数。 Widget 已经提供了 getGeometry、getHeight、getWidth 等方法,您可以使用这些方法来操作和绘制组件。

    2. 当您在子小部件 drawLink 方法中调用 drawEllipse 时,您将 x 和 y 坐标作为矩形开始传递给函数。根据我的理解,你应该把 0, 0 放在那里,因为这些坐标应该是相对于小部件而不是相对于窗口。

    我已经对您的代码进行了一些更改,看看它是否适合您

    import sys, random
    from PyQt4 import QtGui, QtCore
    
    # Robot Widget
    class RobotLink(QtGui.QWidget):
        def __init__(self, parent, x, y, width, height, fill):
            super(RobotLink, self).__init__(parent)
            self._fill     = fill
            self._rotation = 0
            self.setGeometry(x, y, width, height)
    
        def paintEvent(self, e):
            painter = QtGui.QPainter()
            painter.begin(self)
            self.drawLink(painter)
            painter.end()
    
        def drawLink(self, painter):
            painter.setPen(QtGui.QColor(0, 0, 0))
            painter.setBrush(self._fill)
            painter.drawEllipse(0, 0, self.width(), self.height())
    
    # Window
    class Window(QtGui.QWidget):
        # Default Constructor, sets up the window GUI
        def __init__(self):
            super(Window, self).__init__()
            self.initUI()
    
        def initUI(self):
            self._link1 = RobotLink(self, 10, 10, 100, 50, QtCore.Qt.DiagCrossPattern)
            self._link2 = RobotLink(self, 100, 100, 50, 100, QtCore.Qt.Dense5Pattern)
            self._link3 = RobotLink(self, 150, 150, 50, 50, QtCore.Qt.Dense2Pattern)
    
            self.setGeometry(300, 300, 800, 600)
            self.setWindowTitle("CSCE 452 - PaintBot")
    
        def paintEvent(self, e):
            super(Window, self).paintEvent(e)
            painter = QtGui.QPainter()
            painter.begin(self)
            self.drawBoundingBoxes(painter)
            painter.end()
    
        # Draws the boxes that define the robots workspace and
        # the control panel
        def drawBoundingBoxes(self, painter):
            color = QtGui.QColor(0, 0, 0)
            color.setNamedColor("#cccccc")
            painter.setPen(color)
    
            # Draw the robot workspace
            painter.setBrush(QtGui.QColor(255, 255, 255))
            painter.drawRect(10, 10, 500, 578)
    
            # Draw the control panel workspace
            painter.setBrush(QtGui.QColor(150, 150, 150))
            painter.drawRect(520, 10, 270, 578)
    
            # Draws the slider 'base'
            painter.setPen(QtGui.QColor(0, 0, 0))
            painter.drawLine(100, 570, 400, 570)
    
        def changeValue(self, value):
            self.wid.emit(QtCore.SIGNAL("updateRobot(int)"), value)
            self.wid.repaint()
    
    # Setup the Window, and the Robot
    app = QtGui.QApplication(sys.argv)
    win = Window()
    win.show()
    app.exec_()
    

    希望这会有所帮助,问候

    【讨论】:

      猜你喜欢
      • 2015-11-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 2018-04-20
      相关资源
      最近更新 更多