Фокусировка на табулированном QDockWidget в PyQt

StackOverflow https://stackoverflow.com/questions/1290882

  •  18-09-2019
  •  | 
  •  

Вопрос

У меня есть три QDockWidgets, которые отображаются с вкладками при запуске с помощью QMainWindow.tabifyDockWidget.

В главном окне, после всех addDockWidget звонки:

self.tabifyDockWidget(self.dock_widget1, self.dock_widget2)
self.tabifyDockWidget(self.dock_widget1, self.dock_widget3)

Основываясь на определенных действиях, я хотел бы выбрать одну из этих вкладок и перевести ее в режим "Фокус" или поверх двух других, если она еще не видна.Я пробовал использовать setVisible и setWindowState(Qt.WindowActive), но ничего не меняется.

Есть ли способ программно выбрать виджет dock с вкладками и вывести его на передний план?

Это было полезно?

Решение

Благодаря ответу в списке рассылки qt-interest это очень просто сделать с QWidget.raise():

http://qt-project.org/doc/qt-4.8/qwidget.html#raise

В PyQt это QWidget.raise_():

http://pyqt.sourceforge.net/Docs/PyQt4/qwidget.html#raise

Другие советы

Для меня:

dock2.показать();

док2.поднять();

этого было достаточно.Но да, и то, и другое необходимо!

Я не тестировал это, но вот что я бы попробовал в Qt 4.5+ (преобразование PyQt я оставлю вам):

class MyMainWindow ; // A QMainWindow

void MyMainWindow::bringToFront( QDockWidget* dockIn )
{
   QList<QDockWidget*> docks = tabifiedDockWidgets( dockIn ) ;
   foreach( QDockWidget* dock, docks )
   {
      // Move second dock on top of first dock widget.
      tabifyDockWidget( dock, dockIn ) ;
   }
}

Видишь QMainWindow::tabifiedDockWidgets() и QMainWindow::tabifyDockWidget().

У меня это не сработало:

dock2.raise_() 

Мне удалось заставить его работать, используя:

dock2.show()
parent.tabifyDockWidget(dock1, dock2)

Если вы ищете решение, позволяющее установить фокус на виджет, а не оставлять его на QDockWidget с вкладками в фоновом режиме, вы можете использовать видимость-измененный сигнал и a прокси - сервер фокуса вот так:

class Dock(QDockWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.visibilityChanged.connect(self.setVisibility)

    def setVisibility(self, visible):
        if visible: self.setFocus()

    def setWidget(self, widget:QWidget):
        super().setWidget(widget)
        self.setFocusProxy(widget)

небольшой рабочий пример:

app = QApplication([])
main = QMainWindow()
dock1 = Dock('Dock1', main )
dock1.setWidget(QTextEdit(dock1))
dock2 = Dock('Dock2', main )
dock2.setWidget(QTextEdit(dock2))
main.addDockWidget(Qt.LeftDockWidgetArea, dock1)
main.tabifyDockWidget(dock1, dock2)
main.show()
app.exec()

Решение, которое работает для меня, это :

tabifyDockWidget(dock1, dock2)
dock2.setVisible(True)
dock2.setFocus()
dock2.raise_()

Эти 3 функции кажутся необходимыми.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top