我有三个QDockWidgets,它们在启动时使用QMainWindow.tabifyDockWidget
标记。
在主窗口中,在所有addDockWidget
来电之后:
self.tabifyDockWidget(self.dock_widget1, self.dock_widget2)
self.tabifyDockWidget(self.dock_widget1, self.dock_widget3)
根据某些操作,我想选择其中一个标签并将其置于焦点上,或者,如果它尚未显示,则选择其他两个标签。我尝试过使用setVisible
和setWindowState(Qt.WindowActive)
,但没有任何变化。
有没有办法以编程方式选择选项卡式停靠窗口小部件并将其置于前端?
答案 0 :(得分:21)
感谢qt-interest邮件列表上的答案,这与QWidget.raise()
非常简单:
http://qt-project.org/doc/qt-4.8/qwidget.html#raise
在PyQt中,它是QWidget.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 signal和focus 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()