Найти - Пользователи
Полная версия: PyQt +сделать окно поверх всех
Начало » GUI » PyQt +сделать окно поверх всех
1
Ockonal
Приветствие!
Код создания окна:
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)
Но окно вдруг исчезает! А программа продолжает работать. В чем ошибка?
Спасибо.
poltergeist
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()
Ockonal
Спасибо! Супер советы! Все это мне надо было.
Kyrym
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_())
PEHDOM
Kyrym
А если прописать через self.hide() выход будет правильным?
если поставить self.hide() выхода вообще не будет, оно скроет ваше окно но обработчик событый будет по прежнему работать.
Kyrym
Если на кнопку, то у меня не работает.
ХЗ вроде работает и на кнопку и так..
Kyrym
Что-то не пойму, эта функция куда ставится?
Никуда не ставится, это переопределенная функуия, вызываеться автоматически при закрытии окна. Вы можете изменить ее поведения, например вписа туда далоговое окно, типа “документ не сохранен, сохранить да/нет”. Или написать event.ignore(), тогда окно нельзя будет закрыть. Ну или на что вашей фантазии хватит.

john2103
Всем доброго времени суток! Помогите с этим же вопросом. Я не давно начал изучать питон. Хочу сделать, что бы по нажатию на кнопку 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_()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB