Доброго времени суток.
Имеется MDI-программа на Qt. MDI-окошко разделено сплиттером пополам. Верхняя часть окна - виджет, наследованный от QScrollView; нижняя - от QTextEdit (используется в ReadOnly-режиме, в конструкторе класса стоит setReadOnly (TRUE)). Верхняя часть окна перехватывает и обрабатывает нажатия на клавиатуру; от нижней требуется только отображение (от QTextEdit его наследовали только для удобства построчного добавления туда текстовой информации).
Беда: пока окошко только что открыто верхняя половина прекрасно перехватывает и обрабатывает все нужные нажатия на клавиши. Стоит только мышкой щелкнуть на нижнюю часть окна (т.е. насколько я понимаю, перемещается фокус) - верхней частью окна перестают перехватываться нажатия на Enter и стрелочки. Буквы/цифры и BackSpace перехватываются, как и раньше. По нажатию стрелочек скроллится текст в нижнем окне. Клик мышкой на верхней части окна, увы, фокус обратно не возвращает. :-(
Окна создаются следующим образом:
В классе приложения:
void BsconsApp::createClient(BsconsDoc* doc)
{
BSConsWindowSplitter *pSplit = new BSConsWindowSplitter (pWorkspace , "main");
CmdWindow* cmdWin = new CmdWindow (pSplit, 0, WDestructiveClose);
pSplit->pCmdWin = cmdWin;
BsconsView* logWin = new BsconsView(doc, pSplit, 0, WDestructiveClose);
doc->addView (logWin);
pSplit->setResizeMode(logWin, QSplitter::KeepSize);
#ifdef Q_WS_QWS
// Qt/Embedded XOR drawing not yet implemented.
pSplit->setOpaqueResize (TRUE);
#endif
pSplit->resize(640, 480);
pSplit->show();
}
BSConsWindowSplitter - класс, унаследованный от QSplitter и отличающийся от него только дополнительной парой полей (в частности, pCmdWin, в котором хранится указатель на объект виджета верхней части окна), ни один метод родителького класса там не переопределяется.
CmdWindow - класс, унаследованный от QScrollView, верхняя часть MDI-окошка
BsconsView - класс, унаследованный от QTextEdit, нижняя часть MDI-окошка.
Нажатие клавиш перехватывается через класс приложения следующим образом:
void BsconsApp::keyPressEvent (QKeyEvent *e)
{
if (pWorkspace->windowList().isEmpty())
return;
else
{
BSConsWindowSplitter *pActiveSplitter = (BSConsWindowSplitter*) (pWorkspace->activeWindow());
if (pActiveSplitter != 0)
{
CmdWindow *pActiveCmdWin = pActiveSplitter->pCmdWin;
if (pActiveCmdWin != 0)
pActiveCmdWin->OnKeyPressed (e);
}
}
}
т.е. определяется текущее активное MDI-окно и вызывается соответствующая функция для верхней части окна. В виджет нижней части окна по идее события нажатия на клавиатуру вообще не должны приходить. Однако приходят. :-( Как только нижняя часть окна получает фокус ввода, при нажатии на буквы/цифры все происходит по прежнему сценарию. При нажатии же на Enter или стрелочки мы в функцию BsconsApp::keyPressEvent просто не попадаем. Не понимаю, как виджет окна, унаследованного от QTextEdit перехватывает нажатия клавиш, минуя перехват клавиш на уровне класса приложения.
Надеюсь, ситуацию изложил достаточно понятно.
Если не трудно, подскажите, где тут может быть проблема? Нужно, чтобы события от клавиатуры перехватывались всегда и только верхним окном.
Заранее спасибо всем откликнувшимся.