Die Konzentration auf eine tabified QDockWidget in PyQt
Frage
Ich habe drei QDockWidgets, die beim Start mit QMainWindow.tabifyDockWidget
Registerkarten werden.
Im Hauptfenster, nachdem alle der addDockWidget
Anrufe:
self.tabifyDockWidget(self.dock_widget1, self.dock_widget2)
self.tabifyDockWidget(self.dock_widget1, self.dock_widget3)
Basierend auf bestimmte Aktionen, würde Ich mag eine dieser Registerkarten auswählen und bringen zu konzentrieren, oder, oben auf den beiden anderen, wenn es nicht bereits sichtbar ist. Ich habe versucht, setVisible
und setWindowState(Qt.WindowActive)
verwenden, aber es ändert sich nichts.
Gibt es eine Möglichkeit programmatisch ein tabbed Dock-Widget auswählen und nach vorne bringen?
Lösung
Dank einer Antwort auf die qt-Interesse Mailingliste, ist dies sehr einfach mit QWidget.raise()
zu tun:
http://qt-project.org/doc/qt- 4.8 / qwidget.html # erhöhen
In PyQt, es ist QWidget.raise_()
:
http://pyqt.sourceforge.net/Docs/PyQt4/qwidget. html # erhöhen
Andere Tipps
Für mich:
dock2.show ();
dock2.raise ();
war genug. Aber ja, sind beide erforderlich!
ich nicht getestet haben, aber hier ist, was ich in Qt versuchen würde 4.5+ (Ich werde die PyQt Umstellung auf Sie verlassen):
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 ) ;
}
}
Siehe QMainWindow::tabifiedDockWidgets()
und QMainWindow::tabifyDockWidget()
Das hat bei mir nicht funktioniert:
dock2.raise_()
habe ich es geschafft, um es arbeiten mit:
dock2.show()
parent.tabifyDockWidget(dock1, dock2)
Wenn Sie nach einer Lösung, um den Fokus auf das Widget zu setzen und lassen Sie es nicht auf einem tabified QDockWidget im Hintergrund können Sie die Sichtbarkeits geändert Signal und ein Fokus Proxy wie folgt aus:
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)
ein wenig Arbeitsbeispiel:
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()
Eine Lösung, die für mich arbeitet, ist:
tabifyDockWidget(dock1, dock2)
dock2.setVisible(True)
dock2.setFocus()
dock2.raise_()
Die 3-Funktionen notwendig erscheinen.