crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> События в QTableWidget, Как определить код клавиши в currentCellChanged?
aviabunin
  опции профиля:
сообщение 2.10.2011, 4:40
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 31.7.2011
Пользователь №: 2773

Спасибо сказали: 0 раз(а)




Репутация:   0  


Задача - при навигации по таблице с помощью стрелок в зависимости от нажатой клавиши нужно выполнить определенные действия.
Хотелось бы ловить событие типа 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;

    // }

}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 2.10.2011, 6:26
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


я не парю себе мозги. Обрабатываю на головной форме
    if (event->key() == Qt::Key_Enter) {
        if (ui->view->hasFocus()) {
            QModelIndex i = ui->view->currentIndex();
            if (i.isValid()) {
//            действо какое то
                return;
            }
        }
     }
    QWidget::keyPressEvent(event);

где ui->view - QTableViev.

Сообщение отредактировал maint - 2.10.2011, 6:28
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
aviabunin
  опции профиля:
сообщение 2.10.2011, 8:15
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 31.7.2011
Пользователь №: 2773

Спасибо сказали: 0 раз(а)




Репутация:   0  


Сделал обработку на главной форме, (если я правильно понял):
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 варианта обработки стрелок, которые переключались бы , например, клавишей табуляции.
а. обычное перемещение по таблице
б. просто индикация выбранного направления без перемещения.

Спасибо!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 2.10.2011, 8:30
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


Цитата(aviabunin @ 2.10.2011, 14:15) *
Сделал обработку на главной форме, (если я правильно понял):
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 варианта обработки стрелок, которые переключались бы , например, клавишей табуляции.
а. обычное перемещение по таблице
б. просто индикация выбранного направления без перемещения.

Спасибо!

QWidget::keyPressEvent(event); - вот это я зачем написал ? Это как раз, когда свои случаи не наступили, отдавать стандартному обработчику
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
aviabunin
  опции профиля:
сообщение 2.10.2011, 9:53
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 31.7.2011
Пользователь №: 2773

Спасибо сказали: 0 раз(а)




Репутация:   0  


Мне не нужна стандартная обработка - должно быть следующее
1. С помощью стрелок - перемещение по ячейкам.
2. Затем какими-то выбранными алфавитно-цифровыми клавишами - выбор стороны ячейки и затем в режим 1.
3. Лучше, чтобы у стрелок было 2 режима
а. стандартное перемещение
б. выбор стороны
переключение между режимами допустим пробелом.


И по пути если можно. Пытаюсь найти как из одного класса mainwindow.cpp передать параметры в другой класс - paintwidget.cpp (он перекрашивает сторону ячейки)
?
В главном классе я получаю номер столбца и строки так -
    int i = ui->tableWidget->currentRow();
    int j = ui->tableWidget->currentColumn();

А как передать эти значение в класс рисования
#include "qpaintwidget.h"
#include <QPainter>
#include <QDebug>
#include "mainwindow.h"
#include "ui_mainwindow.h"

//QTableWidget *myTabl;

//qpaintwidget::qpaintwidget(QWidget *parent, QTableWidget *tabl) :
qpaintwidget::qpaintwidget(QWidget *parent) :
    QWidget(parent)
{
    //myTabl = tabl;
}
void qpaintwidget::paintEvent(QPaintEvent *) {
    QPainter p(this); // Создаём новый объект рисовальщика
    p.setPen(QPen(Qt::red,1,Qt::SolidLine)); // Настройки рисования


    QString a;


    p.drawLine(0,0,width(),height()); // Рисование линии -- диагональ всей таблицы
}

Странно, что width() и height() таблицы, на которой рисую, доступны а currentRow() той же таблицы - не доступна.
Собственно, рисую то я не на таблице а на layout, которую растянул на всю таблицу для рисования.
А как получить доступ к таблице?
Спасибо!

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 2.10.2011, 10:20
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


перескок в следующую ячейку можно сделать вызовом focusNextChild() в keyEvent. Переключатель режима стрелок только глобальной переменной или переменной определённой в классе. Её и анализировать при обработке нажатия.
Ну а передача параметра совсем просто. Описание в хедере и конструкторе:
qpaintwidget::qpaintwidget(QWidget *parent, второй_параметр)

Создание:
a = new qpaintwidget(QWidget *parent, второй_параметр)



Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
aviabunin
  опции профиля:
сообщение 2.10.2011, 13:21
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 31.7.2011
Пользователь №: 2773

Спасибо сказали: 0 раз(а)




Репутация:   0  


Проблема.
Еще раз задача - перемещаемся по таблице с помощью стрелок.
Затем нужно отметить выбранную с помощью специальных (или тех же стрелок в другом режиме) клавиш F3-F6 клавиш перерисовать выбранную сторону
в другой цвет. Этот выбор должен сохраняться до конца выполнения программы.
Сейчас:
На таблице отрисовываю сторону текущей ячейки, но при переходе в следующую ячейку - отрисовка теряется.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
aviabunin
  опции профиля:
сообщение 2.10.2011, 18:05
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 26
Регистрация: 31.7.2011
Пользователь №: 2773

Спасибо сказали: 0 раз(а)




Репутация:   0  


Код во вложении. Алгоритм следующий.
На QTableWidget накладывается layout - на котором рисуется красный отрезок по координатам одной из сторон текущей ячейки таблицы.
Перемещение по таблице стандартное с помощью стрелок, выбор стороны для раскраски - в помощью клавиш F3..F6. Выбор и отрисовка сторон нормально, но при переходе в другую ячейку отрисовка сторон теряется. А должна сохраняться. Ищу как это сделать минимумом кода.


Прикрепленные файлы
Прикрепленный файл  test3.zip ( 12.31 килобайт ) Кол-во скачиваний: 77
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 2.10.2011, 21:17
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(aviabunin @ 2.10.2011, 7:40) *
но не вижу как его установить для таблицы
установить фильтр событий на область просмотра (viewport) представления.

maint, не цитируй целыми сообщениями.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.4.2024, 2:29