I am trying to keep window by a Pin
button. Here is the code:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QPushButton
from PyQt5 import QtCore
class App(QWidget):
def __init__(self):
super().__init__()
self.title = 'Keep Going'
self.width = 480
self.height = 360
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
self.setFixedSize(self.width, self.height)
self.layout = QVBoxLayout()
self.button = QPushButton('PinTop')
self.button.setCheckable(True)
self.button.clicked.connect(self.winPinTop)
self.layout.addWidget(self.button)
# add tabs to widget
self.setLayout(self.layout)
self.show()
def winPinTop(self):
print('Pin')
button = self.sender()
if button.isChecked():
print('on top')
self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint)
self.show()
else:
print('no top')
self.setWindowFlags(self.windowFlags())
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
The window can not keep on top after clicking the button. I don't know how to fix this.
Infomation may help:
- Python 3.6.8
- PyQt version: 5.13.0
- Ubuntu 19.04
UPDATE
I replace QWidget
with QMainWindow
class to check this bug.
import sys
from PyQt5.QtWidgets import QMainWindow,QApplication, QWidget, QVBoxLayout, QPushButton, QPushButton
from PyQt5 import QtCore
class App(QMainWindow):
def __init__(self):
super().__init__()
self.title = 'Keep Going'
self.width = 480
self.height = 360
self.initUI()
def initUI(self):
self.setWindowTitle(self.title)
win = QWidget()
win.setFixedSize(self.width, self.height)
layout = QVBoxLayout()
button = QPushButton('PinTop')
button.setCheckable(True)
button.clicked.connect(self.winPinTop)
layout.addWidget(button)
# add tabs to widget
win.setLayout(layout)
self.setCentralWidget(win)
self.show()
def winPinTop(self):
print('Pin')
button = self.sender()
if button.isChecked():
print('on top')
self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.Dialog )
print(self.windowFlags())
self.show()
else:
print('no top')
self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowStaysOnTopHint )
print(self.windowFlags())
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
The problem is still here.
UPDATE 2019-9-11
After remove the show
function. I can get the window on top.
def winPinTop(self):
print('Pin')
button = self.sender()
if button.isChecked():
print('on top')
self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint | QtCore.Qt.Dialog )
print(self.windowFlags())
#self.show()
else:
print('no top')
self.setWindowFlags(self.windowFlags() & ~QtCore.Qt.WindowStaysOnTopHint )
print(self.windowFlags())
#self.show()
But the window will close after I click the pin button. When I show this window, it stays on the top.
I don't know why this happened.
Reference: PyQt: Always on top