Russian Qt Forum
Октябрь 02, 2024, 05:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Снова проблемы с установкой фокуса на QListWidget  (Прочитано 2711 раз)
Андрей80
Гость
« : Июль 22, 2009, 18:46 »

Здравствуйте. Извините , что поднимаю вопрос неоднократно обсуждавшийся, (нашёл две ветки на вашем форуме, но не смог решить проблему).

Пишу простой текстовый редактор для кода, в нём над наследником QTextEdit в определённый момент должен появляться наследник QListWidget с списком методов и свойств переменной класса, о чём идёт речь, все прекрасно поняли. Под Виндовс всё работает таким образом:
как только вызывается methidsList->show() (или methodsList->setVisible(true), в linux от этого пришлось отказатся, т к список не хочет становится видимым) фокус ввода передаётся ему. В линукс же при вызове methodsList->show() список появляется, но фокус ввода при этом остается у QTextEdit. В Windows я не могу сделать так, чтобы фокус был у QTextEdit, в Linux - наоборот, чтобы он был у QListWidget.
Код
C++ (Qt)
void MainWindow :: onDot()
{
QTextCursor cursor = editor->textCursor();
int pos = cursor.selectionStart();
int selectionstart = pos;
QString t = getVarName(pos).trimmed();
int d = t.indexOf(".");
if (d == 0) {
pos -= t.length();
t = getVarName(pos) + t;
}
CurrentFile file;
QString type;
if (t.indexOf("this.") != -1) {
t = t.split(".")[1];
type = file.searchClassField(editor->toPlainText(), t, selectionstart); //ищем в полях текущего класса
}else
type = file.searchVar(editor->toPlainText(), t, selectionstart); //ищем ближайшее вхождение переменной
 
if (type != "undefined") {
bool f = methods->setType(type);
if (!f) return;
this->selectionStart = selectionstart;
QString path = QApplication::applicationDirPath();
path += "/data/setting/listmethods.ini";
IniFile init(path);
int x = init["dx"].toInt();
int y = init["dy"].toInt();
int w = init["width"].toInt();
int h = init["height"].toInt();
QRect r = editor->cursorRect();
methods-> setGeometry(r.x() + this->x() + editor->x() + x, r.y() +  editor->y() + this->y() + y, w, h);
methods->show();
methods->setFocus(Qt::TabFocusReason);
}
}
 
Можете "на пальцах" объяснить, как работать с setFocus, setFocusPolicy?  Буду благодарен.
« Последнее редактирование: Июль 22, 2009, 18:50 от Андрей80 » Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #1 : Июль 23, 2009, 03:23 »

Если я правильно понял вы реализуете Code Completion - сори что не могу помочь по теме, можете попробовать посмотреть как сделано в QtCreator - работает и в Линукс и в Виндовс (там собственно не появляется весь список и это правильно т.к. будет загромождать весь экран для методов класса кот. были много раз перегружены, и даже фокус не уходит из редактора - и это правильно т.к. дополнитель кода - это доп. информация вроде, но реакцией на кнопочки "вверз", "вниз" перебираются варианты).

А вообше мое мнение что у пользователя не должно ничего перед глазами всплывать - я еще ни в одной программе не видел абсолютно корректного "дополнителя" - даже в креаторе иногда он как то застывает или появляется когда я не хочу и приходиться бегать с места на место для ого чтобы он исчез...Но это мелочи... Мне кажется информация которая повляется в этом всплывающем окошке должна быть внизу на специальной панельке (около или даже на панели статуса). Когда "комплетион" должен появиться она заполнена, когда нет - пустая, если надо заполнить но нет исходных данных unresolved или др... - и глазам не мешает и всегда знаешь где ее искать. Если бы в средах была такая опция("использовать невсплывающий постоянно прилепленный к одному месту дополнитель кода") - я бы всегда ее включал. Если вы согласитесь так сделать - то ваша проблема с фокусами отойдет.

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.281 секунд. Запросов: 22.