题
我有三个 QDockWidgets,它们在启动时使用选项卡 QMainWindow.tabifyDockWidget
.
在主窗口中,完成所有操作后 addDockWidget
呼叫:
self.tabifyDockWidget(self.dock_widget1, self.dock_widget2)
self.tabifyDockWidget(self.dock_widget1, self.dock_widget3)
根据某些操作,我想选择这些选项卡之一并将其置于焦点上,或者将其置于其他两个选项卡之上(如果它尚未可见)。我尝试过使用 setVisible
和 setWindowState(Qt.WindowActive)
, ,但没有任何改变。
有没有一种方法可以以编程方式选择选项卡式停靠小部件并将其置于最前面?
解决方案
由于采用QT-interest邮件列表上的答案,这是非常简单,QWidget.raise()
做的:
http://qt-project.org/doc/qt- 4.8 / qwidget.html#提高
在PyQt的,这是QWidget.raise_()
:
其他提示
有关我:
dock2.show();
dock2.raise();
就足够了。但是,是的,两者都需要!
我还没有测试过这个,但这是我在 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()
.
这并没有为我工作:
dock2.raise_()
我设法得到它的工作使用:
dock2.show()
parent.tabifyDockWidget(dock1, dock2)
如果您正在寻找一种解决方案来将焦点设置到小部件而不是将其留在后台的选项卡式 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()
这是为我工作一种解决方案是:
tabifyDockWidget(dock1, dock2)
dock2.setVisible(True)
dock2.setFocus()
dock2.raise_()
这3个功能似乎必要的。
不隶属于 StackOverflow