【问题标题】:Setting buttons inside a widget a circular layout in Pyside在Pyside中将小部件内的按钮设置为圆形布局
【发布时间】:2014-03-14 20:50:49
【问题描述】:

我正在尝试将按钮放置在圆形布局中。这是我目前写的代码。

class Temp(QPushButton):
    def __init__(self, x, y, w, h, parent = None):
        super(Temp, self).__init__(parent)
        self.w = w
        self.h = h
        self.x = x
        self.y = y
        self.text = "test"


    def paintEvent(self, e):

        super(self.parent, self).paintEvent(e)

        qp = QPainter()
        qp.begin(self.viewPort())
        self.drawP(qp)
        qp.end()

    def drawP(self, qp):
        qp.setPen(Qt.red)
        qp.drawEllipse(self.x, self.y, self.w, self.h)



class Example(QWidget):

    def __init__(self):
       super(Example, self).__init__()
       self.initUI()

    def initUI(self):      

       self.setGeometry(300, 300, 350, 100)
       self.setWindowTitle('Points')
       self.show()

    def paintEvent(self, e):
       qp = QPainter()
       qp.begin(self)
       self.drawP(qp)
       qp.end()

    def drawP(self, qp):
       theta = 2 * np.pi  / 15
       for i in range(15):
           angle = theta * (i + 1)
           dx = int(round(400 + 300 * np.cos(angle)))
           dy = int(round(300 + 300 * np.sin(angle)))
          #qp.drawEllipse(dx, dy, 10, 10)
          t = Temp(dx, dy, 10, 10, parent = self)




app = QApplication(sys.argv)  
ex = Example()
sys.exit(app.exec_())

如果我取消注释 Example 类中的 drawEllipse 函数,我会得到圆形布局中的椭圆,而不是按钮。

【问题讨论】:

    标签: python qt user-interface pyside


    【解决方案1】:

    您混淆了多个问题:

    1. 您不应该在绘制事件中添加新的小部件。按钮应添加到构造函数中的示例。

    2. 您应该从 QPushButtons 开始,让它们工作,然后才切换到您自己的类。 10x10 太小,无法显示按钮!

    3. 小部件不应显示自己。它的用户应该这样做。

    4. 按钮没有视口。

    5. 添加到已显示小部件的小部件将不可见。

    从这样的开始:

    class Example(QWidget):
      def __init__(self):
        super(Example, self).__init__()
        self.initUI()
    
      def initUI(self):      
        theta = 2 * np.pi  / 15
        for i in range(15):
          angle = theta * (i + 1)
          dx = int(round(self.width()/2 + self.width()/3 * np.cos(angle)))
          dy = int(round(self.height()/2 + self.height()/3 * np.sin(angle)))
          b = QPushButton("test", parent = self)
          b.setGeometry(QRect(dx, dy, 50, 50))
    
    app = QApplication(sys.argv)  
    ex = Example()
    ex.setGeometry(300, 300, 350, 100)
    ex.show()
    sys.exit(app.exec_())
    

    【讨论】:

    • 可以在setGeometry函数中定义多边形吗?
    【解决方案2】:

    这是一个清理后的工作版本:

    class Temp(QPushButton):
        def __init__(self, x, y, w, h, parent=None):
            super(Temp, self).__init__(parent)
            self.w = w
            self.h = h
            self.x = x
            self.y = y
            self.text = "test"
    
        def paintEvent(self, e):
            qp = QPainter(self)
            qp.setPen(Qt.red)
            qp.drawEllipse(0, 0, self.w - 2, self.h - 2)
    
    
    class Example(QWidget):
        def __init__(self):
            super(Example, self).__init__()
            self.initUI()
    
        def initUI(self):
            self.setGeometry(300, 300, 350, 100)
            self.setWindowTitle('Points')
            self.drawP()
    
    
        def drawP(self):
            theta = 2 * np.pi / 15
            for i in range(15):
                angle = theta * (i + 1)
                dx = int(round(400 + 300 * np.cos(angle)))
                dy = int(round(300 + 300 * np.sin(angle)))
                t = Temp(dx, dy, 10, 10, parent=self)
                t.setGeometry(dx, dy, 10, 10)
    
    
    app = QApplication(sys.argv)
    ex = Example()
    self.show()
    sys.exit(app.exec_())
    

    一些提示:

    • 您需要在父母.show() 之后添加的每个按钮上调用.show()
    • 几何图形需要在父窗口小部件中设置
    • 最好不要在绘图函数中创建任何小部件,将其放入__init__ 或您的initUI
    • 对于您正在尝试做的事情,QGraphicsScene/View 可能更合适

    【讨论】:

    • 你能解释一下为什么drawEllipse的坐标是0、0、宽、高吗?
    • 每个按钮都有自己的本地空间,所以如果你想从角落开始绘制,它是 0, 0
    • 这是一个顶层小部件展示自己的反模式。当您摆脱它时,您也不必显式显示子小部件。那么,在绘制事件中不创建小部件不仅是“最好的”,而且这样做是错误的。
    猜你喜欢
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 2012-04-11
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多