0 / 0 / 2
Регистрация: 26.01.2011
Сообщений: 96

PyQt5. Проверка условия перед нажатием на кнопку "ОК" в диалоговом окне

12.10.2017, 15:35. Показов 11066. Ответов 3

Студворк — интернет-сервис помощи студентам
Ситуация такая.
Из основного окна вызывается диалоговое окно. В нем вводятся данные в поле.
В диалоговом окне есть кнопки "ОК" и "Cancel".
После нажатия на кнопку "ОК" данные из диалогового окна передаются в основное окно.
Как сделать так, что бы при нажатии на кнопку "ОК" сначала проводилась бы проверка - введены ли данные в поле. Если поле заполнено, то окно закрывается и данные передаются. Если поле не заполнено, то выводится сообщение и окно НЕ закрывается (ожидается ввод данных).

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# -*- coding: utf-8 -*-
from PyQt5 import QtWidgets
import sys
 
class MyDialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        QtWidgets.QDialog.__init__(self, parent)
        self.setWindowTitle("Диалоговое окно")
        self.resize(200, 70)
        
        self.mainBox = QtWidgets.QVBoxLayout()
        
        self.lineEdit = QtWidgets.QLineEdit()
        self.mainBox.addWidget(self.lineEdit)
        
        self.hbox = QtWidgets.QHBoxLayout()
        self.btnOK = QtWidgets.QPushButton("&OK")
        self.btnCancel = QtWidgets.QPushButton("&Cancel")
        self.btnCancel.setDefault(True)
        self.btnOK.clicked.connect(self.accept)
        self.btnCancel.clicked.connect(self.reject)
        self.hbox.addWidget(self.btnOK)
        self.hbox.addWidget(self.btnCancel)
        self.mainBox.addLayout(self.hbox)
        
        self.setLayout(self.mainBox)
 
def on_accepted():
    print("on_accepted")
 
def on_rejected():
    print("on_rejected")
 
def on_finished(status):
    print("on_finished", status)
 
def on_clicked():
    dialog = MyDialog(window)
    dialog.accepted.connect(on_accepted)
    dialog.rejected.connect(on_rejected)
    dialog.finished[int].connect(on_finished)
    result = dialog.exec_()
    if result == QtWidgets.QDialog.Accepted:
        print(dialog.lineEdit.text())
    else:
        print("Нажата кнопка Cancel, кнопка Закрыть или клавиша <Esc>", 
              result)
 
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
window.setWindowTitle("Класс QDialog")
window.resize(300, 70)
 
button = QtWidgets.QPushButton("Отобразить диалоговое окно...")
button.clicked.connect(on_clicked)
 
box = QtWidgets.QVBoxLayout()
box.addWidget(button)
window.setLayout(box)
 
window.show()
sys.exit(app.exec_())
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2017, 15:35
Ответы с готовыми решениями:

Нажать на кнопку в диалоговом окне
Добрый день всем. Подскажите пожалуйста, мне необходимо нажать на кнопку в окне, например &quot;Удалить файл&quot;. Пишу код на VBA и все...

Браузеры не отображают в диалоговом окне кнопку Сохранить?!
В браузерах Mozilla Firefox и IE При попытке сохранить изображение ... в диалоговом окне кнопки &quot;СОХРАНИТЬ&quot; НЕТ... баузеры...

Можно ли в диалоговом окне вывести кнопку «распахнуть» ?
По умолчанию в диалоговом окне есть только одна кнопка в заголовке – крестик «закрыть окно». А можно ли отобразить еще кнопки «распахнуть...

3
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.10.2017, 15:51
Doctor_Che, в чем корректно у тебя трудность? Задача простая как 2 копейки.
0
0 / 0 / 2
Регистрация: 26.01.2011
Сообщений: 96
12.10.2017, 16:05  [ТС]
Не понимаю как предотвратить закрытие окна при на жатии на "ОК", если данные не введены.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.10.2017, 16:21
Лучший ответ Сообщение было отмечено Doctor_Che как решение

Решение

Doctor_Che,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from PyQt5 import QtWidgets
import sys
 
 
class MyDialog(QtWidgets.QDialog):
    def __init__(self, parent=None):
        QtWidgets.QDialog.__init__(self, parent)
        self.setWindowTitle("Диалоговое окно")
        self.resize(200, 70)
 
        self.mainBox = QtWidgets.QVBoxLayout()
 
        self.lineEdit = QtWidgets.QLineEdit()
        self.mainBox.addWidget(self.lineEdit)
 
        self.hbox = QtWidgets.QHBoxLayout()
        self.btnOK = QtWidgets.QPushButton("&OK")
        self.btnCancel = QtWidgets.QPushButton("&Cancel")
        self.btnCancel.setDefault(True)
        self.btnOK.clicked.connect(self.accept)
        self.btnCancel.clicked.connect(self.reject)
        self.hbox.addWidget(self.btnOK)
        self.hbox.addWidget(self.btnCancel)
        self.mainBox.addLayout(self.hbox)
 
        self.setLayout(self.mainBox)
 
    def accept(self):
        # Проверяешь тут то, что хотел, если все хорошо вызываешь
        # super().accept(), если нет, не вызываешь и выводишь подсказку
        pass
 
 
def on_clicked():
    dialog = MyDialog(window)
    result = dialog.exec_()
    if result == QtWidgets.QDialog.Accepted:
        print(dialog.lineEdit.text())
    else:
        print("Нажата кнопка Cancel, кнопка Закрыть или клавиша <Esc>",
              result)
 
 
app = QtWidgets.QApplication(sys.argv)
window = QtWidgets.QWidget()
window.setWindowTitle("Класс QDialog")
window.resize(300, 70)
 
button = QtWidgets.QPushButton("Отобразить диалоговое окно...")
button.clicked.connect(on_clicked)
 
box = QtWidgets.QVBoxLayout()
box.addWidget(button)
window.setLayout(box)
 
window.show()
sys.exit(app.exec_())
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.10.2017, 16:21
Помогаю со студенческими работами здесь

Проверка на ввод числа в диалоговом окне
Подскажите, пожалуйста, как проверить три числа на правильность ввода в диалоговом окне в трех полях ввода TextBox? Три числа в диапазоне...

Как создать кнопку CButton и CEdit на стандартном диалоговом окне
Пожалуйста, подскажите как создать кнопку CButton и CEdit на стандартном диалоговом окне? В MSDN написано так: CButton myButton1; ...

Проверка ввода в диалоговом окне и игнорирование кнопки ОК
Здравствуйте, у меня диалоговое окно для ввода информации о футбольном матче. Если правильно заполнить поля, то на выходе будет новый...

Как реализовать появление данных в заголовке окна и в диалоговом окне по нажатию на кнопку?
как используя таймер реализовать, чтобы при нажатии на кнопку одновременно в заголовке окна и в информационном окне (alert) появлялось...

Остановка бесконечного цикла нажатием на кнопку в окне программы
В окне программы две кнопки, одна запускает бесконечный цикл, другая должна его останавливать. Как это сделать, если после запуска...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru