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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обработка нажатия клавиш в QTableWidget  (Прочитано 10742 раз)
aviabunin
Гость
« : Октября 02, 2011, 05:11 »

Задача - при навигации по таблице с помощью стрелок в зависимости от нажатой клавиши нужно выполнить определенные действия.
Хотелось бы ловить событие типа keyPressEvent(QKeyEvent), но не вижу как его установить для таблицы. Поэтому использую следующее
Код:
    QObject::connect(ui->tableWidget, SIGNAL(currentCellChanged(int,int,int,int)), this, SLOT(MyEventHandler()));
Но  как определить код нажатой клавиши?
Спасибо за любую подсказку или ссылку.
P.S. Обработчик сейчас такой
Код:
void MainWindow::MyEventHandler()
{
    int i = ui->tableWidget->currentRow();
    int j = ui->tableWidget->currentColumn();
    a.number(2);
    a = QString("%1  %2").arg(i).arg(j);   // номера строки и колонки текущей ячейки
    qDebug()<<a;

     //switch(event->key()){
     //case Qt::Key_Up:

     //       qDebug()<<"Pressed Up";
     //       break;

     // case Qt::Key_Down:
     //  qDebug()<<"Pressed Down";
     // break;

    // }

}
Записан
aviabunin
Гость
« Ответ #1 : Октября 02, 2011, 08:09 »

Сделал обработку нажатия клавиши на главной форме :
Код:
void MainWindow::keyPressEvent(QKeyEvent *e)
{

    switch(e->key()){
    case Qt::Key_F3:

             qDebug()<<"Left";
               break;

           case Qt::Key_F4:
              qDebug()<<"Up";
               break;

    case Qt::Key_F5:
       qDebug()<<"Down";
        break;
    case Qt::Key_F6:
       qDebug()<<"right";
        break;
    default:
         qDebug()<<"Change event  ......................";
    }

}
Но при этом возникли следующие проблемы:
1. Если нажимаешь алфавитные клавиши, то таблица переходит в режим редактирования ячейки
    Можно ли это предотвратить? Сейчас я просто задействовал F2, f3,f4,f5 для имитации нажатия перемещения
    вправо, влево и т.п.
2. Хотелось бы сделать чтобы было 2 варианта обработки стрелок, которые переключались бы , например, клавишей табуляции.
    а. обычное перемещение по таблице
    б. просто индикация выбранного направления без перемещения.

Спасибо!
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Октября 02, 2011, 12:07 »

унаследуйся от QTableWidget и переопредели keyPressEvent
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
aviabunin
Гость
« Ответ #3 : Октября 02, 2011, 13:19 »

Проблема.
Еще раз задача - перемещаемся по таблице с помощью стрелок.
Затем нужно отметить выбранную с помощью специальных (или тех же стрелок в другом режиме) клавиш F3-F6 клавиш перерисовать выбранную сторону
в другой цвет. Этот выбор должен сохраняться до конца выполнения программы.
Сейчас:
На таблице отрисовываю сторону текущей ячейки, но при переходе в следующую ячейку - отрисовка теряется.
Т.к. таблица перерисовывается видимо.
Как можно исправить ситуацию?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Октября 02, 2011, 14:05 »

Код
C++ (Qt)
QTableWidgetItem *item;
item->setBackground(QBrush(Qt::green));
это не должно сбрасываться пока сам не поменяешь фон ячейки.

если не поможет, можешь показать код.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
aviabunin
Гость
« Ответ #5 : Октября 02, 2011, 17:52 »

Код во вложении.
Где-то увидел, что можно использовать QImage в качестве backbuffer, и рисовать в нем, затем обновлять целиком (http://www.prog.org.ru/topic_13567_0.html) . Но для меня все - новое, хотелось бы найти минимальный путь для начала. Сейчас алгоритм такой:
1. в дизайнере на QTableWidget сверху ложится в тех же размерах layout - на нем рисую отрезки по известным номерам колонки и столбца текущей ячейки. Причем, если перемещение по таблице с помощью стрелок, то пока выбор одной из четырех сторон с помощью клавиш F3 .. F6. Любая сторона отрисовывается, но если уйти с ячейки - затирается. А нужно чтобы отрисовка сторон сохранялась.
Спасибо!
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Октября 02, 2011, 18:37 »

унаследуйся от QTableWidget и переопредели keyPressEvent
похоже, эта фраза осталась без внимания.

про перерисовку - paintEvent полностью перерисовывает виджет, а не дорисовывает его. если хочешь пользоваться своим способом, то тебе надо добавлять все координаты в какой-то список или множество и отрисовывать его содержимое. но какой-то этот способ не слишком хороший...
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
aviabunin
Гость
« Ответ #7 : Октября 02, 2011, 18:53 »

Унаследоваться от QTableWidget - вижу и сделаю. Если это решит проблему пропадания отрисованных отрезков - то этим и займусь.
Т.к. ограничения по времени, хотелось увидеть все проблемы. Мне показалась главная сейчас - перерисовка виджета. Хранить все отрезки - возможно, но хотелось попробовать найти другие пути.
  Возможен путь - рисовать на QImage - и затем как-то перерисовывать на layout, т.е. использовать специальный буфер, где копить изображение - а затем отрисовываеть его на layout.
  Для меня это задача не простая, надеюсь, что кто-то подскажет или ссылку даст.
 
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Октября 02, 2011, 19:17 »

Если это решит проблему пропадания отрисованных отрезков - то этим и займусь.
нет, не решит
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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