LXSession 上的 Qt4 WindowsStayOnTop

Qt4 WindowsStayOnTop on LXSession

我正在 运行 在 raspberry pi 上安装一个使用 qt4 的应用程序。我的应用程序有不同的 windows、主要 window 和对话。当我 运行 我的应用程序在 raspberry pi 桌面上工作正常时,如果我单击主 window.

,对话框不会最终落后于主 window

Qt.WindowStaysOnTopHint 工作正常。 Qt.WindowStaysOnTopHint 确保 window 位于 Main Window 之上,并且不会导致无法访问它。

当我 运行 我的应用程序在 lxsession 上自动启动

Qt.WindowStaysOnTopHint

工具不工作...

知道如何解决吗?

到目前为止我所做的就是调用

Dialog.setWindowFlags(Qt.WindowStaysOnTopHint|Qt.X11BypassWindowManagerHint) 

它有点管用,但对话框没有框架。

class Ui_MainWindow(object):

  def setupUi(self, MainWindow):
       MainWindow.setObjectName(_fromUtf8("MainWindow"))
       MainWindow.resize(800, 480)
       MainWindow.setMinimumSize(QtCore.QSize(800, 480))
       MainWindow.setMaximumSize(QtCore.QSize(800, 480))
       MainWindow.setWindowFlags(Qt.FramelessWindowHint)

class ControlMainWindow(QtGui.QMainWindow):

   def __init__(self, parent=None):
      super(ControlMainWindow, self).__init__(parent)
      self.ui = Main_Window.Ui_MainWindow()
      self.ui.setupUi(self)

以上是我的主要 window 设置

下面是我的对话框设置,我从 MainWindow 调用它来显示。

class Ui_Dialog(object):

   def setupUi(self, Dialog):

    Dialog.setObjectName(_fromUtf8("Dialog"))
    Dialog.resize(492, 200)
    Dialog.setMinimumSize(QtCore.QSize(492, 200))
    Dialog.setMaximumSize(QtCore.QSize(492, 200))
    Dialog.setWindowFlags(Qt.WindowStaysOnTopHint)


class ControlMainDialog(QtGui.QDialog):

def __init__(self, parent=None):
    super(ControlMainDialog, self).__init__(parent)

    self.ui = Ui_Dialog()
    self.ui.setupUi(self)

我在 Dialog 或 ControlMainDialog 中将父级设置为:

Dialog.setParent(Qt.QMainWindow) 

这不正确,知道吗?

我设法解决了这个问题,实际上这里有详细的记录 [https://doc.qt.io/qt-5/qdialog.html#modal-dialogs]。当我想显示我的 window 时,我通过调用 show() 使用无模式对话框,这允许我访问其他 window 并使对话框落后于主要 window,这是我的问题. Using Modal dialog就是使用exec()显示对话框,解释如下:

When an application modal dialog is opened, the user must finish interacting with the dialog and close it before they can access any other window in the application

模式对话框需要父实例

删除 Dialog.setWindowFlags(Qt.WindowStaysOnTopHint)(这会重置其他重要的 window 标志,例如 Qt.Dialog 标志);首先创建主 window,然后创建对话框 ,将主 window 实例 作为父级。

app = QtGui.QApplication(sys.argv)
mainWindow = ControlMainWindow()
mainWindow.show()
dialog = ControlMainDialog(mainWindow)
dialog.exec_()
sys.exit(app.exec_())

setParent 即使在对话框初始化后也可以使用,但它总是需要一个父控件实例。在 QDialog documentation.

阅读更多内容