专注于PyQt中的表格化QDockWidget

时间:2009-08-17 22:39:43

标签: qt pyqt pyqt4

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

在主窗口中,在所有addDockWidget来电之后:

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

根据某些操作,我想选择其中一个标签并将其置于焦点上,或者,如果它尚未显示,则选择其他两个标签。我尝试过使用setVisiblesetWindowState(Qt.WindowActive),但没有任何变化。

有没有办法以编程方式选择选项卡式停靠窗口小部件并将其置于前端?

6 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:5)

对我来说:

dock2.show();

dock2.raise();

就够了。但是,是的,都需要!

答案 2 :(得分: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()

答案 3 :(得分:0)

对我有用的解决方案是:

tabifyDockWidget(dock1,dock2)

dock2.setVisible(True)

dock2.setFocus()

dock2.raise_()

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

答案 4 :(得分:0)

这对我不起作用:

dock2.raise_() 

我设法使用:

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

答案 5 :(得分:0)

如果您正在寻找一种将焦点设置到小部件的解决方案,而不是将其放在后台的列表化QDockWidget中,则可以使用visibility-changed signalfocus proxy,如下所示:

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()