2011-02-25 132 views
3

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

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_() 

任何想法如何附上我的小部件,没有布局,定位它,并将它显示我的窗内?

回答

0

夫妇的事情,我在你的代码注意:

  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_() 

希望这会有所帮助,至于