При использовании нескольких QDockWidget-ов, размещенных с помощью tabifyDockWidget, переключение фокуса клавишей TAB приводит к установке фокуса в неотображаемый в данный момент виджет (неактивная вкладка QTabBar). Прилагаю тест, см. ниже
#include <QApplication>
#include <QMainWindow>
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#include <QDockWidget>
#include <QTextEdit>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow()
{
QTextEdit *te = new QTextEdit;
te->setTabChangesFocus(true);
setCentralWidget(te);
QAction *exitAct = new QAction(tr("E&xit"), this);
exitAct->setShortcut(tr("Ctrl+Q"));
connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
QMenu *fileMenu = new QMenu(tr("&File"), this);
fileMenu->addAction(exitAct);
menuBar()->addMenu(fileMenu);
QTextEdit *te1 = new QTextEdit;
te1->setTabChangesFocus(true);
QDockWidget *dw1 = new QDockWidget(tr("dw1"), this);
dw1->setWidget(te1);
addDockWidget(Qt::RightDockWidgetArea, dw1);
QTextEdit *te2 = new QTextEdit;
te2->setTabChangesFocus(true);
QDockWidget *dw2 = new QDockWidget(tr("dw2"), this);
dw2->setWidget(te2);
tabifyDockWidget(dw1, dw2);
setWindowTitle(tr("Test Focus"));
resize(600, 400);
}
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow window;
window.show();
return app.exec();
}
#include "main.moc"
Задача частично решается установкой обработчика сигнала visibilityChanged(bool), например
void DockWidgetEx::onVisibilityChanged(bool visible)
{
setEnabled(visible);
}
Однако, при запуске программ (после show) значения visible для всех DockWidget-ов установлены в true. Это обидно. Необходима, дополнительная проверка для доков, т.е. dock видим или если он используется с QTabBar, - что он является текущим. Глюк пропадает только после смены текущей вкладки или перетаскивании дока (с использованием обработчика onVisibilityChanged). В Qt4.5 появился метод tabifiedDockWidgets(QDockWidget *dockwidget), но он не дает ответа о настоящей видимости дока. Кто нибудь знает как это сделать или может решил подобную проблему более элегантным способом? Респект заранее.
Интересно, Троли знают про этот баг?
Отправьте репорт Тролям и узнаете ;)