Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/34: Рейтинг темы: голосов - 34, средняя оценка - 4.62
3 / 3 / 0
Регистрация: 31.10.2019
Сообщений: 26

Как узнать, открыто ли диалоговое окно?

03.11.2019, 10:33. Показов 7265. Ответов 12

Студворк — интернет-сервис помощи студентам
Есть одно окно (MainWindow), которое открывает второе (QWidget), диалоговое после нажатия кнопки (btn).
После открытия диалогового окна кнопка (btn) перестает быть активной (self.btn.setEnabled(False)). А после закрытия, снова работает. Но вот в чем вопрос: как узнать, открыто окно или нет?

Сначала я пробовал узнать это с помощью флаговых переменных:

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
class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.main()
 
    def main(self):
        self.btn.clicked.connect(self.open)
        self.is_open = True
        if self.is_open:
            self.btn.setEnabled(True)
        else:
            self.btn.setEnabled(False)
 
    def open(self):            
        self.add = QWidget()
        self.add.show()
        self.is_open = False
 
 
app = QApplication(sys.argv)
ex = MainWindow()
ex.show()
sys.exit(app.exec_())
Но проблема в том, что я не могу узнать, когда пользователь закроет окно, чтобы сделать self.btn.setEnabled(True). Тогда я пробовал делать это через isVariable()

Python
1
2
3
4
if AppendTesk.isVariable():
    self.addTeskBtn.setEnabled(False)
else:
    self.addTeskBtn.setEnabled(True)
и через isHidden(), но в обоих случаях была ошибка:
Python
1
first argument of unbound method must have type 'QWidget'
Повторяю свой вопрос "как узнать, открыто окно или нет?" и дополняю к нему "Чем isHidden() отличается от isVariable()?"
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.11.2019, 10:33
Ответы с готовыми решениями:

Как по HWND узнать, открыто ли окно
Открываю консольное приложение из своей программы на Delphi. Получаю идентификатор окна (HWND). Нужна возможность узнать, не закрылось ли...

Как узнать с помощью VBA в Ассess открыто ли окно БД ?
Запрет на открытие окна БД в Access легко взломать Свойство AllowByPassKey можно перевести обратно в True из другой БД. Может можно...

При запуске Access как узнать, открыто ли окно БД ?
Запрет на открытие окна БД в Access легко взломать Свойство AllowByPassKey можно перевести обратно в True из другой БД. Может можно...

12
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
03.11.2019, 20:01
Лучше использовать систему сигналов-слотов, при закрытии диалогового окна отправляется сигнал, а слот в основном окне делает кнопку активной
0
3 / 3 / 0
Регистрация: 31.10.2019
Сообщений: 26
03.11.2019, 20:03  [ТС]
А каким методом отправляется сигнал? И к чему этот метод применять, я так понимаю к окну - self?
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
03.11.2019, 20:18
Лучший ответ Сообщение было отмечено StudentOfChrist как решение

Решение

Цитата Сообщение от StudentOfChrist Посмотреть сообщение
А каким методом отправляется сигнал? И к чему этот метод применять, я так понимаю к окну - self
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
import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import pyqtSignal, QObject
 
class Dialog(QtWidgets.QDialog):
    closeDialog = pyqtSignal()
 
    def __init__(self, root, **kwargs):
        super().__init__(root, **kwargs)
        self.main = root 
        label     = QtWidgets.QLabel('введите что нибудь')
        self.edit = QtWidgets.QLineEdit()
        button    = QtWidgets.QPushButton('Нажми чтобы отобразить')
 
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(label)
        layout.addWidget(self.edit)
        layout.addWidget(button)
        self.setLayout(layout)
 
    def closeEvent(self, event):
        self.closeDialog.emit()
 
 
class Main(QtWidgets.QWidget):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
 
        layout  = QtWidgets.QHBoxLayout()
        self.label_main = QtWidgets.QLabel()
        self.button = QtWidgets.QPushButton('Нажми')
   
        self.button.clicked.connect(self.button_click)
 
        self.dialog = Dialog(self)
        self.dialog.closeDialog.connect(self.dialog_signal_slot)
 
        layout.addWidget(self.label_main)
        layout.addWidget(self.button)
        self.setLayout(layout)
 
    def button_click(self):
        self.button.setEnabled(False)
        self.dialog.show()
 
    def dialog_signal_slot(self):
        self.button.setEnabled(True)
 
if __name__ == '__main__':
    app  = QtWidgets.QApplication(sys.argv)
    main = Main()  
    main.show()
    sys.exit(app.exec_())
0
3 / 3 / 0
Регистрация: 31.10.2019
Сообщений: 26
04.11.2019, 07:47  [ТС]
Цитата Сообщение от tooru Посмотреть сообщение
closeDialo
говорит, что нет такого атрибута(
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
04.11.2019, 07:55
всю ошибку приведите
0
3 / 3 / 0
Регистрация: 31.10.2019
Сообщений: 26
04.11.2019, 07:57  [ТС]
'Dialog' object has no attribute 'closeDialog'
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
04.11.2019, 08:03
Цитата Сообщение от StudentOfChrist Посмотреть сообщение
'Dialog' object has no attribute 'closeDialog'
Очень странно. Вы запускаете этот вот код или что-то дописываете от себя?
0
3 / 3 / 0
Регистрация: 31.10.2019
Сообщений: 26
04.11.2019, 08:05  [ТС]
Я применил это к своему коду
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
04.11.2019, 08:07
Цитата Сообщение от StudentOfChrist Посмотреть сообщение
Я применил это к своему коду
Вот эту строку вы класс диалога добавили?

Python
1
closeDialog = pyqtSignal()
0
3 / 3 / 0
Регистрация: 31.10.2019
Сообщений: 26
04.11.2019, 08:21  [ТС]
Сейчас добавил. Ошибка не выскакивает, но после закрытия кнопка не становится активной.

Цитата Сообщение от tooru Посмотреть сообщение
def closeEvent(self, event):
* * * * self.closeDialog.emit()
Зачем эта функция, если она нигде не вызывается?
0
1293 / 677 / 367
Регистрация: 07.01.2019
Сообщений: 2,302
04.11.2019, 08:28
А вы слот сделали?

Python
1
2
def dialog_signal_slot(self):
        self.button.setEnabled(True)
и подключили его к сигналу?

Python
1
self.dialog.closeDialog.connect(self.dialog_signal_slot)
Цитата Сообщение от StudentOfChrist Посмотреть сообщение
def closeEvent(self, event):
* * * * self.closeDialog.emit()
Эта функция вызывается pyqt при закрытии диалогового окна
0
3 / 3 / 0
Регистрация: 31.10.2019
Сообщений: 26
04.11.2019, 08:32  [ТС]
Слот я сделал, и вызвал. А вот эту функцию не создавал. Сейчас попробую с ней

Добавлено через 1 минуту
Все теперь работает! СПАСИБО
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.11.2019, 08:32
Помогаю со студенческими работами здесь

Как узнать отображается ли диалоговое окно на экране
плиз, помогите!!!Есть класс наследник от QMainWindow, у него есть член Dialog наследник QDialogx. Dialog немодальный. Нужно узнать при...

Ворд уведомляет, что "открыто диалоговое окно"
Здравствуйте. Буквально на днях началось. Система - windows XP, офис 2007. Всё лицензия корпоративная. Excel, PowerPoint, Outlook...

Как определить открыто ли окно?
Как определить видит ли пользователь окно, то есть активно ли окно?

Как проверить открыто ли окно?
Podskazite, kak proverit otkrito li okno ili net? Spasibo! Inessa

Как проверить открыто ли окно в WPF?
Как проверить открыто ли окно в WPF?


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru