当在主窗口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
)。