PyQt: добавление пользовательского ввода в список - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь создать список, в котором пользователь может ввести больше элементов в список.У меня есть список со кнопкой «Добавить».Кнопка «Добавить» открывает окно ввода данных пользователем, в котором она указывает пользователю ввести значение.Однако у меня есть проблема с передачей значения пользовательского ввода для добавления в список.Любые предложения помогут.Ниже мой код:

Список

from input_box import *

class list_form(QtGui.QWidget):

    def __init__(self,list_of_items,open_text,parent= None):
        super(list_form, self).__init__()

        global output_path
        output_path = output_path_i

        grid = QtGui.QGridLayout()
        grid.setSpacing(10)
        self.widget = QtGui.QWidget()

        self.layout = QtGui.QGridLayout(self.widget)
        open_message = QtGui.QLabel(open_text)
        grid.addWidget(open_message,0,0,2,4)

        self.lst = QtGui.QListWidget()
        grid.addWidget(self.lst,3, 0,1,4)

        for i in list_of_items:
            self.lst.addItem(str(i))

        self.setLayout(grid)

        add = QtGui.QPushButton('Add')
        grid.addWidget(add,50,0)
        add.clicked.connect(self.add_button)

    def add_button(self):
        self.input_box = input_box()
        self.input_box.setWindowTitle("Window 2")
        self.input_box.show()

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = list_form(list(xrange(100)),"List of Values")
    window.setWindowTitle('Window 1')
    window.show()
    sip.setdestroyonexit(False)
    sys.exit(app.exec_())

Поле ввода

import sys
from PyQt4 import QtCore, QtGui
import sip

class input_box(QtGui.QWidget):

    def __init__(self,parent= None):
        super(input_box, self).__init__()

        grid = QtGui.QGridLayout()
        grid.setSpacing(10)
        self.widget = QtGui.QWidget()

        self.layout = QtGui.QGridLayout(self.widget)
        open_message = QtGui.QLabel("Enter Value:")
        grid.addWidget(open_message,0,0,2,3)

        self.txt = QtGui.QLineEdit()
        grid.addWidget(self.txt,2, 0,1,2)

        self.setLayout(grid)

        save = QtGui.QPushButton('Save')
        grid.addWidget(save,50,0)
        a = save.clicked.connect(self.save)
        save.clicked.connect(self.close)

        cancel = QtGui.QPushButton('Cancel')
        grid.addWidget(cancel,50,1)
        cancel.clicked.connect(self.close)


    def save(self):
        value = self.txt.text()
        return value

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Необходимо организовать действие, выполняемое при нажатии кнопки сохранения, для передачи информации обратно в виджет списка.Существует более одного способа сделать это, но простое возвращение данных не сделает этого.

Вот пример того, что будет работать - хотя возможны и другие подходы.

Измените конструктор input_box, чтобы он сохранял ссылку на виджет списка, который он ожидает:

class input_box(QtGui.QWidget):

    def __init__(self, list_widget, parent= None):
        super(input_box, self).__init__()
        self.list_widget = list_widget
        ...

Измените вызов конструктора, чтобы предоставить эту информацию:

    def add_button(self):
        self.input_box = input_box(self.lst)
        self.input_box.setWindowTitle("Window 2")
        self.input_box.show()

Изатем используйте эту информацию в методе save для добавления в виджет списка:

    def save(self):
        value = self.txt.text()
        self.list_widget.addItem(value)

Bingo!

Альтернативный подход может заключаться в том, чтобы input_box излучал сигналс новым значением в нем, и подключите его к слоту на list_form или на list_widget.Или в input_box вы можете перейти через родительский элемент к list_widget.Но я думаю, что моя проста и понятна.

0 голосов
/ 20 ноября 2018

Если вы хотите получить данные из окна, вам следует использовать QDialog вместо QWidget, подключить сигнал щелчка сохранения и отмены к слоту принятия и отклонения, соответственно:

input_box.py

from PyQt4 import QtCore, QtGui

class Input_Box(QtGui.QDialog):
    def __init__(self,parent= None):
        super(Input_Box, self).__init__(parent)

        open_message = QtGui.QLabel("Enter Value:")
        self.txt = QtGui.QLineEdit()
        save = QtGui.QPushButton('Save', clicked=self.accept)
        cancel = QtGui.QPushButton('Cancel', clicked=self.reject)

        grid = QtGui.QGridLayout(self)
        grid.setSpacing(10)
        grid.addWidget(open_message, 0, 0)
        grid.addWidget(self.txt, 1, 0, 1, 2)
        grid.addWidget(save, 2, 0)
        grid.addWidget(cancel, 2, 1)
        self.setFixedSize(self.sizeHint())

    def save(self):
        value = self.txt.text()
        return value

Затем вы используете метод exec_ (), который возвращает код, если он называется принять или отклонить, и в соответствии с этим данные должны быть получены и добавлены.С другой стороны, не используйте глобальные переменные, потому что они являются головной болью при отладке.

from PyQt4 import QtCore, QtGui
from input_box import Input_Box

class list_form(QtGui.QWidget):
    def __init__(self,list_of_items,open_text,parent= None):
        super(list_form, self).__init__()

        open_message = QtGui.QLabel(open_text)
        self.lst = QtGui.QListWidget()
        self.lst.addItems([str(i) for i in list_of_items])
        add = QtGui.QPushButton('Add', clicked=self.add_button)
        grid = QtGui.QGridLayout(self)
        grid.setSpacing(10)
        grid.addWidget(open_message)
        grid.addWidget(self.lst)
        grid.addWidget(add)

    @QtCore.pyqtSlot()
    def add_button(self):
        input_box = Input_Box()
        input_box.setWindowTitle("Window 2")
        if input_box.exec_() == QtGui.QDialog.Accepted:
            val = input_box.save()
            it = QtGui.QListWidgetItem(val)
            self.lst.addItem(it)
            self.lst.scrollToItem(it)

if __name__ == "__main__":
    import sys
    import sip
    app = QtGui.QApplication(sys.argv)
    window = list_form(list(range(100)),"List of Values")
    window.setWindowTitle('Window 1')
    window.show()
    sip.setdestroyonexit(False)
    sys.exit(app.exec_())

Преимущество использования QDialog заключается в разделении между классами, например, нет необходимости передавать QListWidget какдругой ответ предлагает сделать возможным использование этого же диалога для других целей.

...