【问题标题】:Set properties of multiple QLineEdit using a loop使用循环设置多个 QLineEdit 的属性
【发布时间】:2018-05-19 21:35:10
【问题描述】:

我想知道是否可以使用 for 循环设置多个 setFixedHeight() 属性:

for num in range(1, 6):
    self.LineEdit[num].setFixedHeight()

目前我有十二个 QLineEdit 框

LineEdit1, LineEdit2, ... , LineEdit12 我希望用更少的代码来做到这一点。我尝试了上述方法,但它并没有像我预期的那样遍历 LineEdit 框。 self.LineEdit[num] 是否仅适用于列表?

【问题讨论】:

    标签: python python-3.x pyqt pyqt5 qlineedit


    【解决方案1】:

    对于这个任务你可以使用getattr():

    for i in range(1,13):
        getattr(self, "LineEdit{}".format(i)).setFixedHeight(10)
    

    【讨论】:

    • 我也找到了一种不同的方法,方法是使用getattr 创建一个列表并遍历该列表,但您的方法要干净得多。谢谢。
    【解决方案2】:

    你可以使用findChildren()函数。

    例如

    for ctl in self.findChildren(QtGui.QLineEdit):
        ctl.setFixedHeight()
    

    请注意,这将在所有行编辑中调用 setFixedHeight()

    【讨论】:

    • 我希望对应用setFixedHeight() 属性的行编辑范围有更多控制。在我不需要太多控制的情况下,像这样设置它们可能会很有用,我记住了这一点。
    【解决方案3】:

    QuamashCoroutinesobserver-pattern

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    """
    http://code.activestate.com/recipes/131499-observer-pattern/
    *TL;DR80
    Maintains a list of dependents and notifies them of any state changes.
    *Examples in Python ecosystem:
    Django Signals: https://docs.djangoproject.com/en/2.1/topics/signals/
    Flask Signals: http://flask.pocoo.org/docs/1.0/signals/
    """
    
    from __future__ import print_function
    import sys
    from PyQt5.QtWidgets import (QLineEdit, QApplication, QWidget, QVBoxLayout)
    import random
    import asyncio
    
    
    class Subject(object):
        def __init__(self):
            self._observers = []
    
        def attach(self, observer):
            if observer not in self._observers:
                self._observers.append(observer)
    
        def detach(self, observer):
            try:
                self._observers.remove(observer)
            except ValueError:
                pass
    
        def notify(self, modifier=None):
            for observer in self._observers:
                if modifier != observer:
                    observer.update(self)
    
    
    # Example usage
    class Data(Subject):
        def __init__(self, name=''):
            Subject.__init__(self)
            self.name = name
            self._data = 0
            self.default = 0
    
        @property
        def data(self):
            return self._data
    
        @data.setter
        def data(self, value):
            self._data = value
            self.notify()
    
    
    class ObservableViewer:
        _line_edit = None
    
        def __init__(self, line_edit):
            self.line_edit = line_edit
    
        @property
        def line_edit(self):
            return self._line_edit
    
        @line_edit.setter
        def line_edit(self, value):
            self._line_edit = value
    
        def update(self, subject):
            asyncio.get_event_loop().call_soon_threadsafe(self.line_edit.setText, subject.data)
    
    
    class Widget(QWidget):
        layout = None
    
        def __init__(self, parent=None):
            super(QWidget, self).__init__(parent)
            self.x = ['abc', 'def', 'ghi', 'jkl', 'etc']
            self.dx = []
            self._init_component()
            asyncio.run_coroutine_threadsafe(self.update_async(), loop=asyncio.get_event_loop())
    
        def _init_component(self):
            self.layout = QVBoxLayout()
            self.setLayout(self.layout)
            for xi in self.x:
                lei = QLineEdit()
                lei.setAccessibleName(f"__{xi}")
                lei.setText(xi)
                di = Data(str(xi))
                self.dx.append(di)
                ovi = ObservableViewer(line_edit=lei)
                di.attach(ovi)
                di.data = xi
                di.default = xi
                self.layout.addWidget(lei)
    
        @asyncio.coroutine
        async def update_async(self):
            while True:
                for di in self.dx:
                    di.data = f"{di.default}-{random.randrange(0, 101, 2)}"
                await asyncio.sleep(1, loop=asyncio.get_event_loop())
    
    
    if __name__ == "__main__":
        from quamash import (QEventLoop)
    
        app = QApplication(sys.argv)
        loop = QEventLoop(app)
        asyncio.set_event_loop(loop)
        w = Widget()
        w.show()
        sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      相关资源
      最近更新 更多