<p>@saelyth的答案很有趣,但使用内存不正确,因为每次更改数字时都会创建布局,我的解决方案不会创建更多的布局,而是重用它们。在</p>
<p>为此,我们必须进行一些更改以创建更稳定的代码:</p>
<ol>
<li>将<code>QIntValidator</code>设置为<code>QLineEdit</code>,以便用户只能放置数字:</li>
</ol>
<hr/>
<pre><code>self.input_cell.setValidator(QIntValidator(0, 1000, self))
</code></pre>
<ol start=“2”>
<li>将QGridLayout更改为QFormLayout,因为它被优化为在另一个小部件旁边有一个标签。在</li>
</ol>
<hr/>
^{pr2}$
<ol start=“3”>
<li>我们必须添加带有<code>addRow()</code>的项,并删除带有<code>removeRow()</code>的项:</li>
</ol>
<hr/>
<pre><code>@pyqtSlot(str)
def get_input_value(self, val):
self.output_cell.setText(val)
val_int = int(val)
if val_int > (self.layout().rowCount() - 1):
[self.hboxLayout.addRow('Entry '+str(i), QLineEdit(self)) for i in range(self.layout().rowCount(), val_int+1)]
elif val_int < (self.layout().rowCount() - 1):
for i in range(self.layout().rowCount(), val_int, -1):
child = self.hboxLayout.removeRow(i)
</code></pre>
<p>完整代码:</p>
<pre><code>class Input(QWidget):
dataChanged = pyqtSignal(str)
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.input_label = QLabel('Entries:', self)
self.input_cell = QLineEdit(self)
self.input_cell.setValidator(QIntValidator(0, 1000, self))
self.apply_button = QPushButton('Apply')
self.apply_button.setEnabled(False)
self.hboxLayout = QHBoxLayout(self)
self.hboxLayout.addWidget(self.input_label)
self.hboxLayout.addWidget(self.input_cell)
self.hboxLayout.addWidget(self.apply_button)
self.setLayout(self.hboxLayout)
self.input_cell.textChanged.connect(self.apply_change)
self.apply_button.clicked.connect(self.send_value)
self.setWindowTitle("Input window")
self.show()
def apply_change(self, value):
self.apply_button.setEnabled(True)
def send_value(self, value):
if value is False:
self.dataChanged.emit(self.input_cell.text())
self.apply_button.setEnabled(False)
class Output(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.setWindowTitle('Output window')
self.content()
self.show()
def content(self):
layout = QFormLayout(self)
self.output_cell = QLineEdit(self)
layout.addRow('Nr. of entries:', self.output_cell)
layout.setSpacing(10)
def make_connection(self, input_object):
input_object.dataChanged.connect(self.get_input_value)
@pyqtSlot(str)
def get_input_value(self, val):
self.output_cell.setText(val)
val_int = int(val)
if val_int > (self.layout().rowCount() - 1):
[self.layout().addRow('Entry '+str(i), QLineEdit(self)) for i in range(self.layout().rowCount(), val_int+1)]
elif val_int < (self.layout().rowCount() - 1):
for i in range(self.layout().rowCount(), val_int, -1):
child = self.layout().removeRow(i)
</code></pre>