在Pyside中设置小部件内部按钮的圆形布局
我正在尝试把按钮放在一个圆形的布局中。这是我到目前为止写的代码。
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
你把几个问题搞混了:
你不应该在绘制事件中添加新的控件。按钮应该在构造函数里添加到示例中。
你应该先从QPushButton开始,确保它能正常工作,然后再切换到你自己的类。10x10的大小太小了,根本显示不出按钮!
一个控件不应该自己显示,应该由它的使用者来显示。
一个按钮是没有视口的。
如果在一个已经显示的控件上添加新的控件,它们是看不见的。
可以从这样的代码开始:
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_())