Focar um QDockWidget tabified em PyQt
Pergunta
Eu tenho três QDockWidgets que são com guias na inicialização usando QMainWindow.tabifyDockWidget
.
Na janela principal, depois de todas as chamadas addDockWidget
:
self.tabifyDockWidget(self.dock_widget1, self.dock_widget2)
self.tabifyDockWidget(self.dock_widget1, self.dock_widget3)
Com base em determinadas ações, eu gostaria de selecionar um desses guias e trazê-lo para se concentrar, ou, em cima dos outros dois, se ele já não é visível. Eu tentei usar setVisible
e setWindowState(Qt.WindowActive)
, mas nada muda.
Existe uma maneira para programaticamente selecionar um widget com guias doca e trazê-lo para a frente?
Solução
Graças a uma resposta na lista de discussão qt-interesse, isso é muito simples de fazer com QWidget.raise()
:
http://qt-project.org/doc/qt- 4.8 / qwidget.html # raise
Em PyQt, é QWidget.raise_()
:
http://pyqt.sourceforge.net/Docs/PyQt4/qwidget. html # raise
Outras dicas
Para mim:
dock2.show ();
dock2.raise ();
foi suficiente. Mas sim, ambos são necessários!
Eu não testei isso, mas aqui está o que eu iria tentar em Qt 4.5+ (Eu vou deixar a conversão PyQt para você):
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()
e QMainWindow::tabifyDockWidget()
Isto não funcionou para mim:
dock2.raise_()
Eu consegui fazê-lo funcionar usando:
dock2.show()
parent.tabifyDockWidget(dock1, dock2)
Se você está procurando uma solução para definir o foco para o widget e não deixá-lo em um QDockWidget tabified no fundo você pode usar o sinal de visibilidade-mudou e uma concentrar procuração assim:
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)
um pequeno exemplo de trabalho:
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()
Uma solução que está funcionando para mim é:
tabifyDockWidget(dock1, dock2)
dock2.setVisible(True)
dock2.setFocus()
dock2.raise_()
Isso 3 funções parece necessário.