我正在创建一个有许多复选框的应用程序。每 4 个复选框位于一个groupBox_n
(n=36( 内,然后这些 groupBox 位于另一个 groupBox 内。
每个复选框都按照一定的规则命名,这对我来说非常方便。我想访问他们每个人,但我不想每次都输入他们的名字。因此,我想在列表中复制他们的名字,以便我可以迭代列表并根据他们的名字进行控制。
但是当我尝试连接从列表中调用字符串的按钮时,我无法做到这一点。在这里,我用QLineEdit重现了一个示例。
有可能做这样的事情吗?
调用findChildren
对我没有帮助,因为那样我就不知道我的复选框在我的应用程序中的位置是什么,或者"谁是谁"在那里。通过对象名称调用也是不可能的,是吗?
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(400, 300)
self.gridLayout = QtGui.QGridLayout(Form)
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
self.My_lineEdit = QtGui.QLineEdit(Form)
self.My_lineEdit.setObjectName(_fromUtf8("My_lineEdit"))
self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
self.pushButton = QtGui.QPushButton(Form)
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
MyStrinng = 'My_lineEdit'
QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL(_fromUtf8("clicked()")), self.Mystring.clear)
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
Form = QtGui.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec_())
像这样,PyQt
无法将我的字符串识别为对象的名称。我还尝试用QCore.QString('My_lineEdit')
制作一个PyQt
字符串,但QString
不适用于我的版本(您可以在此处查看(
有了这个,我可以复制所有复选框的名称。
names = []
for x in range(0, 6):
for y in range(0, 6):
for z in range(1, 5):
Names = 's'+str(x)+str(y)+'0'+str(z)
names.append(Names)
print(names)
如果要通过对象查找对象,最简单的选择是使用findChild()
:
T QObject::findChild(const QString &name = QString((, Qt::FindChildOptions options = Qt::FindChildrenRecursively( const
返回此对象的子对象,该对象可转换为类型 T 和 称为 name,如果没有此类对象,则称为 0。省略名称 参数会导致匹配所有对象名称。搜索是 递归执行,除非选项指定了选项 FindDirectChildrenOnly。
如果有多个子项匹配搜索,则最直接 祖先返回。如果有几个直系祖先,那就是 未定义将返回哪一个。在这种情况下,findChildren(( 应该使用。
此示例返回名为 parentWidget 的子 QPushButton "button1",即使按钮不是父级的直接子级:
QPushButton *button = parentWidget->findChild<QPushButton *>("button1");
文档中的 C++ 中的示例将转换为以下形式的 python:
button = parentWidget.findChild(QPushButton, "button1")
在您的情况下:
class Ui_Form(object):
def setupUi(self, Form):
...
# change self.lineEdit to self.My_lineEdit
#Form is the parent of My_lineEdit
self.My_lineEdit = QtGui.QLineEdit(Form)
self.My_lineEdit.setObjectName(_fromUtf8("My_lineEdit"))
self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
...
le = Form.findChild(QtGui.QLineEdit, "My_lineEdit")
self.pushButton.clicked.connect(le.clear)