PyQt5保持QWidget始终在顶部



当在主窗口init函数中创建时,我可以强制子部件保持在顶部吗?

当小部件在应用程序范围内创建时,它只对我有效(如这里的PyQt4如何保持QWidget始终在顶部?)。

(在Raspberry Pi OS上测试)

from PyQt5 import QtCore
from PyQt5.QtWidgets import (
QApplication, QMainWindow, QWidget
)
class Ui_MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.setWindowTitle("MainWindow")
self.resize(400, 300)
Widget = Ui_Widget(self)
Widget.show()
class Ui_Widget(QWidget):
def __init__(self,  parent=None):
QWidget.__init__(self, parent)
self.setWindowFlags(self.windowFlags() | QtCore.Qt.Dialog)
self.setWindowTitle("Widget")
self.resize(400, 300)
self.move(200, 150)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
MainWindow = Ui_MainWindow()
MainWindow.show()
# Widget = Ui_Widget(MainWindow)
# Widget.show()
sys.exit(app.exec_())

问题可能与窗口管理器中的某些错误或错误实现有关(在Fluxbox上它按预期工作)。

在任何情况下,为了一致性,您不应该在显示父部件之前显示子部件(假设两者必须同时出现):在处理__init__之后,MainWindow.show()被称为,结果是您过早地显示了子部件。

一个基本的解决方法是在显示子小部件之前调用self.show(),但是通常认为在__init__而不是

显示小部件(包括实例本身)是很好的做法。一个更好的解决方案是创建一个函数来实际显示父部件和,然后创建并显示子部件:

class Ui_MainWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.setWindowTitle("MainWindow")
self.resize(400, 300)
def start(self):
self.show()
Widget = Ui_Widget(self)
Widget.show()
# ...
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
MainWindow = Ui_MainWindow()
MainWindow.start()
sys.exit(app.exec_())

请注意,对于very,通常需要为标准QWidgets使用Dialog标志具体情况。大多数情况下,您可以使用QDialog并调用open()而不是show()。您还应该为子小部件创建一个持久引用,因为您可能需要从主窗口类访问它。
还请注意,命名为Ui_xyz的类通常用于基本UI表单(使用pyuic/pyside-uic创建的那些),变量的名称不应该大写,因为只有类和常量使用此约定(首选mainWindow而不是MainWindow)。

相关内容

  • 没有找到相关文章

最新更新