Qt4 WindowsStayOnTop на LXSession - PullRequest
       21

Qt4 WindowsStayOnTop на LXSession

0 голосов
/ 22 сентября 2019

Я запускаю приложение на Raspberry Pi, которое использует qt4.У моего приложения разные окна, главное окно и диалоги.Когда я запускаю свое приложение на рабочем столе raspberry pi, оно работает нормально, Dialog не оказывается за основным окном, если я нажимаю на главное окно.

Qt.WindowStaysOnTopHint работает нормально.Qt.WindowStaysOnTopHint Обеспечивает, чтобы окно находилось в верхней части главного окна и не заканчивалось тем, что не может получить к нему доступ.

Когда я запускаю свое приложение в 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)

Выше моя настройка главного окна

Ниже моя настройка диалога, которую я звоню из 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)

Я делаю set parentв Dialog или ControlMainDialog как:

Dialog.setParent(Qt.QMainWindow) 

Это не правильно, любая идея?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Для модального диалога требуется родительский экземпляр .

Удалить Dialog.setWindowFlags(Qt.WindowStaysOnTopHint) (что приведет к сбросу других важных оконных флагов, таких как флаг Qt.Dialog);сначала создайте главное окно, а затем создайте диалог с экземпляром главного окна в качестве родительского.

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

setParent можно использовать даже после инициализации диалога, но еговсегда будет требовать родительского экземпляра виджета.Подробнее читайте в документации QDialog .

0 голосов
/ 24 сентября 2019

Мне удалось решить эту проблему, это на самом деле хорошо задокументировано здесь [https://doc.qt.io/qt-5/qdialog.html#modal-dialogs]. Я использовал немодальный диалог, вызывая show (), когда я хотел показать свое окно, это позволило мне получить доступ к другому окну и сделатьдиалоговое окно отстает от главного окна, что было моей проблемой.При использовании модального диалогового окна отображается диалоговое окно с использованием exec (), которое объясняется следующим образом:

Когда открывается модальное диалоговое окно приложения, пользователь должен завершить взаимодействие с диалоговым окном и закрыть его, прежде чем он сможет получить доступ к любомудругое окно в приложении

...