在Pyside中设置小部件内部按钮的圆形布局

0 投票
2 回答
904 浏览
提问于 2025-04-17 22:22

我正在尝试把按钮放在一个圆形的布局中。这是我到目前为止写的代码。

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函数前面的注释去掉,我可以看到一个圆形的图形,但按钮却没有显示在圆形布局里。

2 个回答

1

这里有一个整理过的可用版本:

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 可能更合适
1

你把几个问题搞混了:

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

  2. 你应该先从QPushButton开始,确保它能正常工作,然后再切换到你自己的类。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_())

撰写回答