PyQT работа с переменными в QDialog
Вопрос, как я могу работать со значениями, которые введены/выбраны в диалоговом окне?
Есть следующий код:
front.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'untitled.ui'
#
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_mainWindow(object):
def setupUi(self, mainWindow):
mainWindow.setObjectName("mainWindow")
mainWindow.resize(800, 380)
self.centralwidget = QtWidgets.QWidget(mainWindow)
self.centralwidget.setObjectName("centralwidget")
self.list_1 = QtWidgets.QListView(self.centralwidget)
self.list_1.setGeometry(QtCore.QRect(20, 20, 221, 192))
self.list_1.setObjectName("list_1")
self.list_2 = QtWidgets.QListView(self.centralwidget)
self.list_2.setGeometry(QtCore.QRect(290, 20, 221, 192))
self.list_2.setObjectName("list_2")
self.list_3 = QtWidgets.QListView(self.centralwidget)
self.list_3.setGeometry(QtCore.QRect(560, 20, 221, 192))
self.list_3.setObjectName("list_3")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(20, 230, 101, 31))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(140, 230, 101, 31))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(410, 230, 101, 31))
self.pushButton_3.setObjectName("pushButton_3")
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_4.setGeometry(QtCore.QRect(290, 230, 101, 31))
self.pushButton_4.setObjectName("pushButton_4")
self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_5.setGeometry(QtCore.QRect(680, 230, 101, 31))
self.pushButton_5.setObjectName("pushButton_5")
self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_6.setGeometry(QtCore.QRect(560, 230, 101, 31))
self.pushButton_6.setObjectName("pushButton_6")
mainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(mainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
mainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(mainWindow)
self.statusbar.setObjectName("statusbar")
mainWindow.setStatusBar(self.statusbar)
self.retranslateUi(mainWindow)
QtCore.QMetaObject.connectSlotsByName(mainWindow)
def retranslateUi(self, mainWindow):
_translate = QtCore.QCoreApplication.translate
mainWindow.setWindowTitle(_translate("mainWindow", "MainWindow"))
self.pushButton.setText(_translate("mainWindow", "+"))
self.pushButton_2.setText(_translate("mainWindow", "-"))
self.pushButton_3.setText(_translate("mainWindow", "-"))
self.pushButton_4.setText(_translate("mainWindow", "+"))
self.pushButton_5.setText(_translate("mainWindow", "-"))
self.pushButton_6.setText(_translate("mainWindow", "+"))
class Dialog(QtWidgets.QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
label1 = QtWidgets.QLabel('Введите ФИО сотрудника:')
label2 = QtWidgets.QLabel('Выберите отдел:')
label3 = QtWidgets.QLabel('Выберите должность:')
self.QName = QtWidgets.QLineEdit()
self.QDep = QtWidgets.QComboBox(self)
self.QDep.addItems(['Otdel1', 'Otdel2', 'Otdel3'])
self.QPos = QtWidgets.QComboBox(self)
self.QPos.addItems(['1','2','3'])
btnOk = QtWidgets.QPushButton("Ok", connect=self.hide)
layout = QtWidgets.QGridLayout(self)
layout.addWidget(label1, 1, 1, 1, 1)
layout.addWidget(label2, 2, 1, 1, 1)
layout.addWidget(label3, 3, 1, 1, 1)
layout.addWidget(self.QName, 1, 2, 1, 1)
layout.addWidget(self.QDep, 1, 2, 3, 3)
layout.addWidget(self.QPos, 1, 2, 5, 4)
layout.addWidget(btnOk, 3, 2, 3, 1)
main.py
import sys
from PyQt5 import QtWidgets
import front
class ExampleApp(QtWidgets.QMainWindow, front.Ui_mainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.dialog = front.Dialog()
self.dialog.resize(300,300)
self.pushButton.pressed.connect(self.add)
def add(self):
self.dialog.exec_()
def main():
app = QtWidgets.QApplication(sys.argv)
window = ExampleApp()
window.show()
app.exec_()
if __name__ == '__main__':
main()
Ответы (1 шт):
Представление списка QListView, представление дерева QTreeView и представление таблицы QTableView, основаны на модели, что означает, что операции сбора или хранения данных связаны с моделью.
Следует отметить, что QListView, QTreeView и QTableView
являются родительскими классами QListWidget, QTreeWidget и QTableWidget соответственно.
Целью последних трех является главным образом облегчить использование и ускорить разработку.
По-прежнему принято называть первые три как представления, а последние три - как элементы управления).
В сложных комплексных программах первые три все еще рекомендуются.
QStringListModel - Класс предоставляет модель, которая предоставляет строки для представлений.
Я отметил для вас строки, в которые внес изменения:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QStringListModel
#import front
class Ui_mainWindow(object):
def setupUi(self, mainWindow):
mainWindow.setObjectName("mainWindow")
mainWindow.resize(800, 380)
self.centralwidget = QtWidgets.QWidget(mainWindow)
self.centralwidget.setObjectName("centralwidget")
self.list_1 = QtWidgets.QListView(self.centralwidget)
self.list_1.setGeometry(QtCore.QRect(20, 20, 221, 192))
self.list_1.setObjectName("list_1")
self.list_2 = QtWidgets.QListView(self.centralwidget)
self.list_2.setGeometry(QtCore.QRect(290, 20, 221, 192))
self.list_2.setObjectName("list_2")
self.list_3 = QtWidgets.QListView(self.centralwidget)
self.list_3.setGeometry(QtCore.QRect(560, 20, 221, 192))
self.list_3.setObjectName("list_3")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(20, 230, 101, 31))
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(140, 230, 101, 31))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(410, 230, 101, 31))
self.pushButton_3.setObjectName("pushButton_3")
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_4.setGeometry(QtCore.QRect(290, 230, 101, 31))
self.pushButton_4.setObjectName("pushButton_4")
self.pushButton_5 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_5.setGeometry(QtCore.QRect(680, 230, 101, 31))
self.pushButton_5.setObjectName("pushButton_5")
self.pushButton_6 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_6.setGeometry(QtCore.QRect(560, 230, 101, 31))
self.pushButton_6.setObjectName("pushButton_6")
mainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(mainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
mainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(mainWindow)
self.statusbar.setObjectName("statusbar")
mainWindow.setStatusBar(self.statusbar)
self.retranslateUi(mainWindow)
QtCore.QMetaObject.connectSlotsByName(mainWindow)
def retranslateUi(self, mainWindow):
_translate = QtCore.QCoreApplication.translate
mainWindow.setWindowTitle(_translate("mainWindow", "MainWindow"))
self.pushButton.setText(_translate("mainWindow", "+"))
self.pushButton_2.setText(_translate("mainWindow", "-"))
self.pushButton_3.setText(_translate("mainWindow", "-"))
self.pushButton_4.setText(_translate("mainWindow", "+"))
self.pushButton_5.setText(_translate("mainWindow", "-"))
self.pushButton_6.setText(_translate("mainWindow", "+"))
class Dialog(QtWidgets.QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__(parent)
label1 = QtWidgets.QLabel('Введите ФИО сотрудника:')
label2 = QtWidgets.QLabel('Выберите отдел:')
self.QName = QtWidgets.QLineEdit()
self.QDep = QtWidgets.QComboBox(self)
self.QDep.addItems(['Otdel1', 'Otdel2', 'Otdel3'])
self.QPos = QtWidgets.QComboBox(self)
self.QPos.addItems(['1','2','3'])
self.btnOk = QtWidgets.QPushButton("Ok") # , clicked=self.hide) # +++ self.
layout = QtWidgets.QGridLayout(self)
layout.addWidget(label1, 1, 1, 1, 1)
layout.addWidget(label2, 2, 1, 1, 1)
layout.addWidget(self.QName, 1, 2, 1, 1)
layout.addWidget(self.QDep, 1, 2, 3, 3)
layout.addWidget(self.QPos, 1, 2, 4, 4)
layout.addWidget(self.btnOk, 3, 2, 1, 1)
class ExampleApp(QtWidgets.QMainWindow, Ui_mainWindow): # front.
def __init__(self):
super().__init__()
self.setupUi(self)
self.item_list = ['item %s' % i for i in range(5)] # +
# QStringListModel - Класс предоставляет модель, которая предоставляет строки для представлений.
self.model = QStringListModel(self) # +++
self.model.setStringList(self.item_list) # +
self.list_1.setModel(self.model) # +++
self.dialog = Dialog() # front.
self.dialog.btnOk.clicked.connect(self.btnOk_clicked) # +++
self.pushButton.pressed.connect(self.add)
def add(self):
self.dialog.exec_()
# ++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
def btnOk_clicked(self):
rows = self.model.rowCount()
self.model.insertRow(rows)
self.model.setData(self.model.index(rows, 0), f'QName = {self.dialog.QName.text()}')
# ^^^^^^^^^^^^^^^^^^^^^^^^^
rows = self.model.rowCount()
self.model.insertRow(rows)
self.model.setData(self.model.index(rows, 0), f'QPos = {self.dialog.QPos.currentText()}')
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
self.dialog.hide()
# ++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
def main():
app = QtWidgets.QApplication(sys.argv)
window = ExampleApp()
window.show()
app.exec_()
if __name__ == '__main__':
main()
