Уведомления

Группа в Telegram: присоединиться

#1 Апрель 25, 2009 23:59:07

Ockonal
От:
Зарегистрирован: 2009-03-05
Сообщения: 85
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt +сделать окно поверх всех

Приветствие!
Код создания окна:

class Application(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, None, Qt.Tool | Qt.FramelessWindowHint)
self.setFocusPolicy(Qt.StrongFocus)
self.setAttribute(Qt.WA_QuitOnClose, True)
И когда мне надо, пытаюсь сделать его поверх всех:
self.setWindowFlags(Qt.WindowStaysOnTopHint)
Но окно вдруг исчезает! А программа продолжает работать. В чем ошибка?
Спасибо.



Офлайн

#2 Апрель 26, 2009 08:34:18

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt +сделать окно поверх всех

setWindowFlags:

Note: This function calls setParent() when changing the flags for a window, causing the widget to be hidden. You must call show() to make the widget visible again..
В общем надо делать show() после смены флагов окна.

И ещё, надо писать так: self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint), иначе вы другие флаги сбросите. Гляньте у себя в списке процессов, у меня при закрытии окна процесс остаётся в памяти, self.setAttribute(Qt.WA_QuitOnClose, True) как буд-то не сработал (GNU/Debian squeeze). Это можно вылечить так:
    def closeEvent(self, event):
QtGui.QApplication.exit()



Отредактировано (Апрель 26, 2009 08:36:15)

Офлайн

#3 Апрель 26, 2009 10:10:11

Ockonal
От:
Зарегистрирован: 2009-03-05
Сообщения: 85
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt +сделать окно поверх всех

Спасибо! Супер советы! Все это мне надо было.



Офлайн

#4 Янв. 20, 2018 10:09:15

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 222
Репутация: +  3  -
Профиль   Отправить e-mail  

PyQt +сделать окно поверх всех

poltergeist
Это можно вылечить так:
     def closeEvent(self, event):
        QtGui.QApplication.exit()
Что-то не пойму, эта функция куда ставится? Если на кнопку, то у меня не работает.
А если прописать через self.hide() выход будет правильным? В памяти ничего не останется?

 # Python 3
# -*- coding: utf-8 -*-
import sys, os
from PyQt4 import QtCore, QtGui, Qt
from PyQt4.QtGui import (QWidget, qApp, QAction, QApplication, QHBoxLayout, QVBoxLayout,
                         QGridLayout, QLabel, QLineEdit, QTextEdit, QPushButton, QComboBox,
                         QCheckBox, QRadioButton, QFrame, QScrollArea, QTabWidget, QSizePolicy,
                         QGroupBox, QFileDialog, QMessageBox, QPlainTextEdit,
                         QLCDNumber, QSpinBox,
                         QBrush, QColor)
from PyQt4.QtGui import QIcon, QPixmap, QPalette, QTextCursor
class Opoveschenie(QWidget):    
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        
        self.setMinimumSize(100, 100) # Минимальная ширина и высота окна
        self.adjustSize()
        self.setWindowTitle('Оповещение') # Заголовок
        self.setWindowIcon(QIcon('res/res_picture/icon.png')) # Иконка
        #self.setWindowFlags(QtCore.Qt.Window.WindowStaysOnTopHint()) # окно на передний план
        self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
        
        sss_vivod = ("color: #f2f2f0; font: 16pt 'Courier New'")
        text = 'Заданный<br>\
                текст'
        # БЛОК РАЗМЕТКИ
        vbox_os = QVBoxLayout()
        # ---
        self.pole_1 = QTextEdit('<center>'+text+'</center>')
        self.pole_1.setReadOnly(1)
        self.pole_1.setStyleSheet(sss_vivod)
        vbox_os.addWidget(self.pole_1)
        # --- ---
        self.button_ok = QPushButton('Ок')
        self.button_ok.clicked.connect(self.closeEvent)
        vbox_os.addWidget(self.button_ok)
        # --- ---
        vbox_os.addStretch()
        self.setLayout(vbox_os) # установка рабочей области
    def closeEvent(self, event):
        self.hide()
        #QtGui.QApplication.exit()
# КОНЕЦ
if __name__ == "__main__":
    app = QApplication(sys.argv)
    opoveschenie = Opoveschenie()
    opoveschenie.move(40,500)
    opoveschenie.show()
    
    sys.exit(app.exec_())

Отредактировано Kyrym (Янв. 20, 2018 10:10:45)

Офлайн

#5 Янв. 20, 2018 21:44:12

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 897
Репутация: +  160  -
Профиль   Отправить e-mail  

PyQt +сделать окно поверх всех

Kyrym
А если прописать через self.hide() выход будет правильным?
если поставить self.hide() выхода вообще не будет, оно скроет ваше окно но обработчик событый будет по прежнему работать.
Kyrym
Если на кнопку, то у меня не работает.
ХЗ вроде работает и на кнопку и так..
Kyrym
Что-то не пойму, эта функция куда ставится?
Никуда не ставится, это переопределенная функуия, вызываеться автоматически при закрытии окна. Вы можете изменить ее поведения, например вписа туда далоговое окно, типа “документ не сохранен, сохранить да/нет”. Или написать event.ignore(), тогда окно нельзя будет закрыть. Ну или на что вашей фантазии хватит.

Офлайн

#6 Окт. 11, 2018 21:12:09

john2103
Зарегистрирован: 2018-10-11
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt +сделать окно поверх всех

Всем доброго времени суток! Помогите с этим же вопросом. Я не давно начал изучать питон. Хочу сделать, что бы по нажатию на кнопку Test, форма становилась поверх всего(включая панель задач)… Прочитав все что было выше, мне это не помогло. Причем, если добавить

 self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
в __init__ это работает, но по кнопке не работает.
Код моего скрипта
 import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QMainWindow, QLabel, QDesktopWidget, \
	QProgressBar, QHBoxLayout, QMessageBox
from PyQt5.QtGui import QIcon, QBitmap, QColor, QFont, QPixmap
from PyQt5.QtCore import QBasicTimer
from PyQt5 import QtCore
class Main(QMainWindow):
	def __init__(self):
		super().__init__()
		self.setMinimumSize(640, 480)
		self.setWindowTitle('Окно родитель всех форм')
		self.move(500, 200)
		self.center()
		self.Creat_label()
		self.exit()
		self.test()
	def center(self):
		qr = self.frameGeometry()
		cp = QDesktopWidget().availableGeometry().center()
		qr.moveCenter(cp)
		self.move(qr.topLeft())
		self.resize(QDesktopWidget().availableGeometry().width(), QDesktopWidget().availableGeometry().height())
	def Creat_label(self):
		label = QLabel('Text', self)
		label.setText(str(QDesktopWidget().availableGeometry()))
		label.resize(label.sizeHint())
	def exit(self):
		button = QPushButton('Exit', self)
		button.clicked.connect(self.close)
		button.move(50, 50)
	def test(self):
		button = QPushButton('Test', self)
		button.clicked.connect(self.test_func)
		button.move(150, 50)
	def test_func(self):
		self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowStaysOnTopHint)
		self.show()
if __name__ == '__main__':
	app = QApplication(sys.argv)
	ex = Main()
	ex.show()
	app.exec_()

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version