回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在尝试在PySide中创建一个复选框列表。
这些复选框将位于框架内的网格中。在</p>
<p>我想最好的办法是把这些支票放进一个柜子里。
在<code>class Ui_MainWindow(object):</code>中有<code>def setupUi(self, MainWindow):</code>,在这个范围内,我用<code>self.myChanges(MainWindow, self.customCheckBoxes, self.frame, self.gridLayout)</code>调用我的方法<code>myChanges</code>。就在上面,我创建了一个空列表,试图用<code>self.customCheckBoxes = []</code>来存储对象</p>
<p>在<code>Ui_MainWindow</code>类之外,我有一个名为<code>CreateCheckbox</code>的独立类,它试图在框架下创建一个复选框,设置对象的名称,将其添加到网格中的某个位置并设置其文本。据我所知,它可以很好地执行前两个,问题出在<code>self.grid.addWidget(self.checkBox, gridPlace, 1, 1, 1)</code>行。更具体地说,它与<code>grid</code>有问题,并抛出以下错误:<code>AttributeError: 'CreateCheckbox' object has no attribute 'grid'</code></p>
<p>我的问题是:</p>
<ol>
<li>我是不是用错了网格?在</li>
<li>当我通过网格时,不允许在网格周围使用点吗?在</li>
<li>我如何解决这个问题,使所有的复选框都沿着网格向下一行?在</li>
<li>我的<code>CreateCheckbox</code>类或我的<code>myChanges</code>方法是否在错误的位置/我应该把它们放在哪里?在</li>
</ol>
<p>编辑:我想我发现我做错了什么。在<code>class CreateCheckbox</code>中,<code>self.grid.addWidget(self.checkBox, gridPlace, 1, 1, 1)</code>中应该没有<code>self.</code>,因为网格不是<code>CreateCheckbox</code>类的实例</p>
<p>编辑2:为了防止有人想让文本生效,在<code>MainWindow</code>中加上引号
<code>self.checkBox.setText(QtGui.QApplication.translate(MainWindow, text, None, QtGui.QApplication.UnicodeUTF8))</code>所以你有
<code>self.checkBox.setText(QtGui.QApplication.translate("MainWindow", text, None, QtGui.QApplication.UnicodeUTF8))</code></p>
<p>以下是完整代码:</p>
<pre><code>from PySide import QtCore, QtGui
class Ui_MainWindow(object):
def myChanges(self, MainWindow, checkboxes, frame, grid):
for j in range(100):
checkboxes.<a href="https://www.cnpython.com/list/append" class="inner-link">append</a>(CreateCheckbox(MainWindow, frame, grid, "Test", j))
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.frame = QtGui.QFrame(self.centralwidget)
self.frame.setGeometry(QtCore.QRect(180, 90, 371, 311))
self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
self.frame.setFrameShadow(QtGui.QFrame.Raised)
self.frame.setObjectName("frame")
self.gridLayout_2 = QtGui.QGridLayout(self.frame)
self.gridLayout_2.setObjectName("gridLayout_2")
self.gridLayout = QtGui.QGridLayout()
self.gridLayout.setObjectName("gridLayout")
self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
# Create list holding checkbox objects
self.customCheckBoxes = []
self.myChanges(MainWindow, self.customCheckBoxes, self.frame, self.gridLayout)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
class CreateCheckbox(object):
def __init__(self, MainWindow, frame, grid, text, gridPlace):
# 1. Create under appropriate frame
self.checkBox = QtGui.QCheckBox(frame)
# 2. Set its name
# Although the designer does this, pretty sure this is unneccesary
self.checkBox.setObjectName(chr(gridPlace))
# 3. Add it to the appropriate spot in the grid
self.grid.addWidget(self.checkBox, gridPlace, 1, 1, 1)
# 4. Set text that user sees
# For now, I'm just sending 'Test'
self.checkBox.setText(QtGui.QApplication.translate(MainWindow, text, None, QtGui.QApplication.UnicodeUTF8))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
</code></pre>