我如何重新初始化python pyqt5 gui

时间:2017-08-23 12:28:21

标签: python pyqt5

我有一个简单的程序,由两个QWidgets组成。一个是输入窗口,另一个是输出窗口。输入窗口有一个QlineEdit,一旦我使用信号和插槽点击Apply,该值就会传递到输出窗口QlineEdit。我目前的计划是什么样的:

enter image description here

到目前为止一切正常。我想要实现的是,根据我在输入中给出的数字,输出窗口中应出现类似数量的“Entry options”(新的QlineEdits)。我想要实现的目标:

enter image description here

我希望很清楚我想要实现的目标。下面你会看到我的工作代码,如图1所示。我刚刚进入编程阶段,所以在这个阶段,代码的小例子对我的帮助不仅仅是干手册。

  ToastBindingGeneric binding = new ToastBindingGeneric();

  binding.Children.Add(new AdaptiveText() { Text = "Foo" });

   binding.Children.Add(new AdaptiveText() { Text = "Trying to do something here hello!!!" });

  ToastContent content = new ToastContent()
  {
    Visual = new ToastVisual()
    {
      BindingGeneric = binding
    }
  };
  ToastNotificationManager.CreateToastNotifier().Show(new ToastNotification(content.GetXml()));

2 个答案:

答案 0 :(得分:0)

好消息是你的问题的一半很容易解决。替换您的代码并执行它以查看结果。

def content(self):
    layout = QGridLayout()
    output_label = QLabel('Nr. of entries:', self)
    self.output_cell = QLineEdit()

    for x in range(3):
        entry_label_1 = QLabel('Entry'+str(x)+':', self)
        entry_cell_1 = QLineEdit()
        layout.addWidget(entry_label_1, x+1, 0)
        layout.addWidget(entry_cell_1, x+1, 2)

    layout.addWidget(output_label, 0, 0)
    layout.addWidget(self.output_cell, 0, 2)
    layout.setSpacing(10)
    self.setLayout(layout)

在我的例子中,我使用range(3)作为循环的示例,告诉程序创建3个文本框。如果你改变范围(10)......好吧,猜猜看。

现在棘手的部分是你只需要捕获输入数据并用range(3)替换int(self.output_cell.text())并完成它。但是,有很多方法可以实现这一目标。您选择使用信号,而我主要在我的程序中使用全局变量,所以我不完全知道它对您有用。当我找到一个简单的方法时,我会更新这个答案。

答案 1 :(得分:0)

@saelyth回答很有意思,但由于每次更改数字时都会创建布局,因此使用内存不正确,我的解决方案不会创建更多布局,而是重用它们。

为此,我们必须进行一些更改以创建更稳定的代码:

  1. QIntValidator设置为QLineEdit,以便用户只能放置数字:
  2. self.input_cell.setValidator(QIntValidator(0, 1000, self))
    
    1. 将QGridLayout更改为QFormLayout,因为它已经过优化,在另一个小部件旁边有一个标签。
    2. layout = QFormLayout(self)
      
      1. 我们必须使用addRow()添加项目,并使用removeRow()
      2. 删除项目
        @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)
        

        完整代码:

        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)