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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top