Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: norD от Май 21, 2005, 23:00



Название: вопрос по QTable
Отправлено: norD от Май 21, 2005, 23:00
Добрый день. Мне нужно изменить порядок переключения между элементами таблицы (по-умолчанию сверху-вниз, а я хочу слева направо). В доках советуют переписывать функции QTable::activateNextCell() , но что-то у меня не получается. Как это сделать?


Название: вопрос по QTable
Отправлено: BaltikS от Май 23, 2005, 11:56
Во первых описать новый класс от QTable. Затем переопределить обработку нажатия клавиш, выставляя нужной ячейке фокус. :lol:


Название: вопрос по QTable
Отправлено: norD от Май 23, 2005, 21:05
Ну с наследованием от QTable понятно, а как обработчик клавиш пределать (например для Ентер)? Так будет работать?:
Код:

MyClass:: event (QEvent *event)
{
    if(e->type()== QEvent::KeyPress)
        {
            QKyEvent* keyEvent = (QKeyEvent*) e;
            if(keyEvent->key() == Key_Enter)
              {
                   //здесь переключаемся на новую ячейку
                  return true;  
                }
  return QWidget:: event(event);
}

И у меня еще вопрос мне надо изменять размерность таблицы и я
скрываю строки и столбцы и подстраиваю размер таблицы с помощью
SizeHint, но остается белый фон (который находился под ними). Как от него избавится?


Название: вопрос по QTable
Отправлено: norD от Май 24, 2005, 22:35
Так, ну с пустым местом от таблицы разобрался-- надо было не скрывать столбцы и строки, а удалять. Возможно когда просто они просто скрываются, то SizeHint() "думает", что таблица не менялась и оставляет все как было. А вот с переопределением обработки нажатия клавиш фигня получается. Написал я вот такой код:
Код:

bool MyTable:: event(QEvent *event)
{
if(event->type()== QEvent::KeyPress)
        {
           QKeyEvent* keyEvent = (QKeyEvent*) event;
           if(keyEvent->key() == Key_Enter)
             {
   int nCurRow= currentRow ();
   int nCurCol= currentColumn();
   endEdit ( nCurRow, nCurCol, true, false );
      if((nCurRow==MyTable::Rows-1)&&(nCurCol==MyTable::Columns-1))
{
setCurrentCell (0,0);
return true;
}
if(nCurCol==MyTable::Columns-1)
{
nCurRow++;
nCurCol=-1;
}
setCurrentCell (nCurRow,++nCurCol );

                return true;  
              }
}
  return QWidget:: event(event);
}
 

И  теперь, когда фокус ввода находится в таблице при нажатии Enter
он действительно переходит между ячейками слева направо, только вот когда я изменяю содержимое ячейки и нажимаю Enter фокус как и раньше движется сверху вниз :twisted:


Название: вопрос по QTable
Отправлено: BaltikS от Май 26, 2005, 11:58
Я сделал так:
bool MyTable::eventFilter(QObject *target, QEvent *event)
{
    if (event->type() ==QEvent::KeyPress)
    {
        QKeyEvent *keyEvent = (QKeyEvent *)event;
        if (keyEvent->key() == 4100)    // если нажата клавиша ENTER
       {
            setCurrentCell(currentRow(), currentCol()+1);
            return true;
       }
    }
...........................................................................................
}
______________________________________________________
Работает на 100%. Таким образом можно переопределить любую клавишу. Да и обратите внимание, коды клавиш ENTER левого и правого - не совпадают!  :lol: [/i][/b]


Название: вопрос по QTable
Отправлено: norD от Май 26, 2005, 21:44
Спасибо за вариант, я уже по другому сделал: оставил в покое Enter (и правый и левый)-- пусть себе сверху вниз гуляет, а просто начал табом пользоваться :D Теперь у пользователя есть выбор либо с Enterom сверху-вниз или Tabом слева- направо 8) Думаю препод, который сие чудо будет приниать останется доволен.
У меня вот другой вопрос возник: чтобы мое приложение на других машинах запускать нужна qt-334.dll, можно ли использовать какие-нибудь урезанные версии? А то у меня приложение 80кб и библиотека 5мб. Или хотя бы как эту библиотеку внутрь exe пихнуть, чтобы отдельно два файла не таскать?