0

我正在创建一个具有许多复选框的应用程序。每 4 个复选框在一个groupBox_n(n=36) 内,然后这些 groupBoxes 在另一个 groupBox 内。

每个复选框都按照一定的规则命名,这对我来说非常方便。我想访问他们每个人,但我不想每次都输入他们的名字。所以我想在一个列表中重现他们的名字,这样我就可以遍历列表并根据他们的名字进行控制。

但是当我尝试连接一个从列表中调用字符串的按钮时,我无法做到这一点。在这里,我使用 QLineEdit 复制了一个示例。

有可能做这样的事情吗?

打电话findChildren对我没有帮助,因为那时我不知道我的复选框在我的应用程序中的位置是什么,或者那里的“谁是谁”。通过 ObjectName 调用也是不可能的,是吗?

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不将我的字符串识别为对象的名称。我也尝试用 制作一个PyQt字符串QCore.QString('My_lineEdit'),但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)
4

1 回答 1

2

如果要通过对象查找对象,最简单的选项是使用findChild()

T QObject::findChild(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

返回此对象的子对象,该子对象可以转换为类型 T 并称为名称,如果没有此类对象,则返回 0。省略 name 参数会导致匹配所有对象名称。搜索以递归方式执行,除非选项指定选项 FindDirectChildrenOnly。

如果有多个匹配搜索的孩子,则返回最直接的祖先。如果有多个直系祖先,则未定义将返回哪一个。在这种情况下,应该使用 findChildren()。

此示例返回名为“button1”的 parentWidget 的子 QPushButton,即使该按钮不是父级的直接子级:

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)
于 2017-08-13T21:36:58.853 回答