Есть ли способ создать диалог ввода в pyqt5, который не закрывается после нажатия кнопки ОК - PullRequest
0 голосов
/ 03 марта 2020

Можно ли как-нибудь создать диалог ввода с помощью comboBox, который не закрывается после нажатия кнопки ОК. Я пытался использовать

QInputDialog.setOption (QInputDialog [NoButtons, on = True])

Это не сработало. Я попытался использовать второе окно, но не смог правильно его настроить.

Кроме того, есть ли способ использовать этот сигнал кнопки ОК для моей логики c в другом месте?

1 Ответ

0 голосов
/ 03 марта 2020

Если вы хотите открыть QInputDialog с опцией QInputDialog.NoButtons, вы можете сделать это:

dg = QInputDialog()
dg.setOption(QInputDialog.NoButtons)
dg.setComboBoxItems(['Item A', 'Item B', 'Item C'])
dg.exec_()

Цель класса QInputDialog - предоставить очень простой и удобный способ получить пользователя вход, без особого места для настройки. Сигнал кнопки ОК всегда подключается к слоту accept диалогового окна. Если вы хотите изменить настройки для различных сигналов и слотов, я бы предложил создать подкласс QDialog и создать свой собственный. Вот простой пример, когда окно не закрывается при нажатии OK, вместо этого текущий элемент просто печатается в оболочке.

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class CustomDialog(QDialog):

    item_selected = pyqtSignal(str)

    def __init__(self, items, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.box = QComboBox()
        self.box.addItems(items)
        btn = QPushButton('Ok')
        btn.clicked.connect(self.ok_pressed)
        vbox = QVBoxLayout(self)
        vbox.addWidget(self.box)
        vbox.addWidget(btn)

    def ok_pressed(self):
        self.item_selected.emit(self.box.currentText())


class Template(QWidget):

    def __init__(self):
        super().__init__()
        dg = CustomDialog(['Item A', 'Item B', 'Item C'], self)
        dg.item_selected[str].connect(self.do_something)
        dg.exec_()

    def do_something(self, item):
        print(item)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    gui = Template()
    gui.show()
    sys.exit(app.exec_())
...