16

我有三个 QDockWidgets,它们在启动时使用QMainWindow.tabifyDockWidget.

在主窗口中,在所有addDockWidget调用之后:

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

基于某些操作,我想选择其中一个选项卡并将其置于焦点,或者,如果它尚不可见,则在其他两个选项卡之上。我试过使用setVisibleand setWindowState(Qt.WindowActive),但没有任何改变。

有没有办法以编程方式选择一个选项卡式停靠小部件并将其带到前面?

4

6 回答 6

24

感谢 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

于 2009-08-19T18:16:30.353 回答
9

为了我:

码头2.show();

码头2.raise();

就够了。但是,是的,两者都是必需的!

于 2013-03-04T13:53:12.743 回答
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()

于 2009-08-18T00:06:46.610 回答
0

对我有用的解决方案是:

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

这3个功能似乎是必要的。

于 2010-12-08T11:30:34.030 回答
0

这对我不起作用:

dock2.raise_() 

我设法让它工作使用:

dock2.show()
parent.tabifyDockWidget(dock1, dock2)
于 2014-02-25T23:54:57.603 回答
0

如果您正在寻找一种解决方案来将焦点设置到小部件而不是将其留在后台的选项卡式 QDockWidget 上,您可以使用可见性更改信号焦点代理,如下所示:

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()
于 2019-09-17T07:57:04.940 回答