在Pyside中将小部件内的按钮设置为圆形布局
Posted
技术标签:
【中文标题】在Pyside中将小部件内的按钮设置为圆形布局【英文标题】:Setting buttons inside a widget a circular layout in 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 函数,我会得到圆形布局中的椭圆,而不是按钮。
【问题讨论】:
【参考方案1】:您混淆了多个问题:
您不应该在绘制事件中添加新的小部件。按钮应添加到构造函数中的示例。
您应该从 QPushButtons 开始,让它们工作,然后才切换到您自己的类。 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_())
【讨论】:
可以在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 这是一个顶层小部件展示自己的反模式。当您摆脱它时,您也不必显式显示子小部件。那么,在绘制事件中不创建小部件不仅是“最好的”,而且这样做是错误的。以上是关于在Pyside中将小部件内的按钮设置为圆形布局的主要内容,如果未能解决你的问题,请参考以下文章