PyQt:有没有更好的方法在代码中设置对象名称?

Posted

技术标签:

【中文标题】PyQt:有没有更好的方法在代码中设置对象名称?【英文标题】:PyQt: is there an better way to set objectName in code? 【发布时间】:2018-06-06 17:44:48 【问题描述】:

当您使用 Qt_Designer 或 Qt_Creator 设计表单时,任何给定小部件的 objectName 总是设置为某个值。但是,如果您在代码中创建了一个小部件,并且稍后需要 objectName,则必须明确分配它。因此,小部件分配至少需要两行代码。这看起来很不雅。

例子:

button1 = QPushButton('button caption')   # at this point objectName is some kind of empty string
button1.setObjectName('button1')

如果您以后需要查找小部件(即使用 findChild),则必须设置 objectName,否则您将不走运。

有没有什么方法可以自动设置 objectName 而无需额外的代码行?我查看了PyQt5 Reference Guide 并找不到这样的功能。 A similar question was asked 在 Code Review 上,但没有得到答案。两行代码不是世界末日,但似乎是多余的。不知何故,我需要为 Python(第一行)和 Qt 再次分配此名称两次。

【问题讨论】:

default 更方便的是 Python 对象与 Qt objectName 具有相同的“名称”。当您在 .ui 文件上使用 uic 时就是这种情况。 uic 为你做。在 uic(或其他地方)中是否有一个便利功能,可以让我在代码中动态创建小部件 --在一行中 -- 分配了 objectName? 嗨@eyllanesc,关于 QPushButton 声明,我已经修改了我的代码 sn-p 以便 text() 属性与名称不同。在我的理想世界中,如果我有 button1 = QPushButton(),则 objectName 将是 button1。我希望有一种我不知道的自动方法来做到这一点。 QPushButton('Text', objectName='foo') PS:更好的解决方案是避免使用objectName,而直接使用self.foo = QPushButton('Text')。那么就完全不用findChild了。 @ekhumoro,我在表单调整大小代码中使用了 findChild。为此,我不想硬编码每个控件名称。我只是按小部件类型并根据小部件更改字体大小、指示器大小。 【参考方案1】:
button1 = QPushButton('button caption', objectName='button1')

您可以在初始化期间将此扩展到任何 Qt 属性:

button1 = QPushButton(text='button caption', objectName='button1', icon=icon1)

此外,在构造对象时也可以连接信号:

button1 = QPushButton(text='button caption', objectName='button1', clicked=someMethod)

添加的命名参数等价于button1.clicked.connect(someMethod)

【讨论】:

嗯。我不知道你可以为任何财产做到这一点。凉爽的。它仍然(在我看来)过度打字,但它有效。 我正在尝试这样做,但是 PyCharm 检测到一个错误,它说 Expected type Union, got QWidget instead

以上是关于PyQt:有没有更好的方法在代码中设置对象名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 QGridLayout 中设置小部件的顺序

如何在 Pyqt4 中设置 QTableView 标头名称

如何在 PyQt5 中设置 QTableWidget 的单元格样式?

在pyqt5中设置显示窗口的代码是啥?

如何在 PyQt5 中设置布局的固定高度?

如何在 QTextBrowser (Html) 中设置文本颜色? (PyQt)