使用循环设置多个 QLineEdit 的属性
Set properties of multiple QLineEdit using a loop
我想知道是否可以使用 for 循环设置多个 setFixedHeight()
属性:
for num in range(1, 6):
self.LineEdit[num].setFixedHeight()
目前我有十二个QLineEdit框
LineEdit1、LineEdit2、...、LineEdit12,我希望用更少的代码来完成。我尝试了上述方法,但它没有像我预期的那样遍历 LineEdit 框。 self.LineEdit[num]
只适用于列表吗?
您可以使用findChildren()
功能。
例如
for ctl in self.findChildren(QtGui.QLineEdit):
ctl.setFixedHeight()
请注意,这将在所有行编辑中调用 setFixedHeight()
。
对于此任务,您可以使用 getattr()
:
for i in range(1,13):
getattr(self, "LineEdit{}".format(i)).setFixedHeight(10)
和Quamash, Coroutines and observer-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_())
我想知道是否可以使用 for 循环设置多个 setFixedHeight()
属性:
for num in range(1, 6):
self.LineEdit[num].setFixedHeight()
目前我有十二个QLineEdit框
LineEdit1、LineEdit2、...、LineEdit12,我希望用更少的代码来完成。我尝试了上述方法,但它没有像我预期的那样遍历 LineEdit 框。 self.LineEdit[num]
只适用于列表吗?
您可以使用findChildren()
功能。
例如
for ctl in self.findChildren(QtGui.QLineEdit):
ctl.setFixedHeight()
请注意,这将在所有行编辑中调用 setFixedHeight()
。
对于此任务,您可以使用 getattr()
:
for i in range(1,13):
getattr(self, "LineEdit{}".format(i)).setFixedHeight(10)
和Quamash, Coroutines and observer-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_())