Russian Qt Forum

Qt => Общие вопросы => Тема начата: panAlexey от Октябрь 18, 2011, 20:35



Название: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: panAlexey от Октябрь 18, 2011, 20:35
почему QTableView может не ловить Qt::Key_Insert?

Код:
void uoDbRefTableView::keyPressEvent(QKeyEvent *event)
{
    int key = event->key();
    const QModelIndex idx = currentIndex();
    switch (key){
    case Qt::Key_Delete:   {
        emit onDelElement(currentIndex());
        break;
    }
    case Qt::Key_Insert:    {
        emit onNewElement(currentIndex());
        break;
    }
    case Qt::Key_Enter:
    case Qt::Key_Return:
    {
        emit doubleClicked(idx);
        return;
    }
    case Qt::Key_Plus:{
        if (qApp->keyboardModifiers() & Qt::ControlModifier){
            emit onNewGroup(idx);
        }
            break;
    }
    default:
        break;
    }
    QTableView::keyPressEvent(event);
}
в конструкторе скомандовал дополнительно:
    grabKeyboard();
что еще ему нужно?????????


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: Bepec от Октябрь 19, 2011, 07:11
Я бы лично посоветовал использовать

Код:
int scancode = pe->nativeScanCode() & 0xFF;

Когда я пытался работать с Qt'шными обозначениями клавиш, то выпадала проблема при переключении на русскую раскладку, и некорректное поведение дублирующих клавиш.

Сделай проще - выведи какой нить нотификатор при каждом нажатии клавиши с меткой аля "клавиша, текст, нативный код, виртуальный код". Проблема решится. (если не ловит, то тогда искать перехватчиков :) )

update:

Ступил поутру помоему.

Вопрос: нажатие инсерта не проходит в keyPressEvent?
Или просто не свитчает туда?

UPDATE:

В тестовом примере, через скан коды, клавиша insert ловится.

Пример: пустая форма, наследник от QTableView, и метод
Код:
void table::keyPressEvent(QKeyEvent * pe)
{
int scancode = pe->nativeScanCode() & 0xFF;

             // 82 - скан код insert [10/19/2011 Bepec]
if (scancode == 82)
scancode = 98; // лишь бы было куда ткнуть брекпоинт
}


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: Bepec от Октябрь 19, 2011, 08:12
Мысль у меня... Grab ты в каком конструкторе поставил? :)


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: GreatSnake от Октябрь 19, 2011, 09:55
в конструкторе скомандовал дополнительно:
    grabKeyboard();
что еще ему нужно?????????
Ну это уж слишком... Зачем же так топором да между ног...


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: Bepec от Октябрь 19, 2011, 10:01
Ну уж если одна таблица на весь Main, то почему нет :P


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: GreatSnake от Октябрь 19, 2011, 10:03
Ну уж если одна таблица на весь Main, то почему нет :P
Да потому что так проблемы не решаются  :P


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: Bepec от Октябрь 19, 2011, 10:57
Кстати, если уж реально там 1 виджет, то никакой разницы не будет (он итак будет ловить все нажатия.)


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: panAlexey от Октябрь 19, 2011, 11:47
в конструкторе скомандовал дополнительно:
    grabKeyboard();
что еще ему нужно?????????
Ну это уж слишком... Зачем же так топором да между ног...
что в нем такого экстремального?


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: GreatSnake от Октябрь 19, 2011, 12:02
что в нем такого экстремального?
В том, что из-за проблем с Insert весь клавиатурный ввод доступен будет только для QTableView. Разве это нормально?


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: Bepec от Октябрь 19, 2011, 12:02
Все нажатия клавы будут идти на TableView.
Если у тебя будет  диалог, форма, доп виджет, поле ввода. То они не получат ни 1 сигнала с клавиатуры :)

У меня в проекте есть такая необходимость (Пульт управления), но там на доп формы я снимаю граб releaseKeyboard()'ом. :)


PS как там у тя с insert'ом? У меня все нормально ловится и без граба.


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: panAlexey от Октябрь 19, 2011, 12:09
что в нем такого экстремального?
В том, что из-за проблем с Insert весь клавиатурный ввод доступен будет только для QTableView. Разве это нормально?
нет конечно, я это уже вчера прочуствовал.
убрал грабкейворд.


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: panAlexey от Октябрь 19, 2011, 12:20
PS как там у тя с insert'ом? У меня все нормально ловится и без граба.
Пофигу ему. Такое впечатление, что нажатие как эвент вообще не приходит в void uoDbRefTableView::keyPressEvent(QKeyEvent *event)
точки останова не срабатывают.


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: panAlexey от Октябрь 19, 2011, 12:26
PS как там у тя с insert'ом? У меня все нормально ловится и без граба.
Пофигу ему. Такое впечатление, что нажатие как эвент вообще не приходит в void uoDbRefTableView::keyPressEvent(QKeyEvent *event)
точки останова не срабатывают.

ловится только комбинация:
Код:
    case Qt::Key_Insert:    {
        //if (qApp->keyboardModifiers() & Qt::NoModifier)
        if (qApp->keyboardModifiers() & Qt::ControlModifier)
            emit onNewElement(currentIndex());
        break;
    }
те Ctrl+Ins
Вернее только она приходит, чистый туда не ходит..


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: Bepec от Октябрь 19, 2011, 12:40
Я ж те советовал в скан коде позырить, вообще 82 код приходит или нет. В keyPressEvent всмысле.

И такое чуйство что у тебя какой то элемент его перехватывает на себя. То ли кнопка, то ли меню.

PS как вариант попытаться Insert поймать у формы своей.

А в идеале бы выложил проектик свой, я б покопался :) Потому что у меня на чистом Table работает, значит проблема в компонентах.


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: panAlexey от Октябрь 19, 2011, 12:43
Я ж те советовал в скан коде позырить, вообще 82 код приходит или нет. В keyPressEvent всмысле.
Не приходит, уже проверил.
ссылка на проект (http://unnstudioreport.googlecode.com/files/uodbmanager.rar)


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: GreatSnake от Октябрь 19, 2011, 13:02
Вот работающий пример:
Код
C++ (Qt)
#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
#include <QKeyEvent>
 
class TableView : public QTableView
{
public:
TableView( QWidget* p = 0 )
: QTableView( p )
{}
 
void keyPressEvent( QKeyEvent* e )
{
qWarning( "key=%d", e->key() );
 
switch( e->key() )
{
case Qt::Key_Insert:
qWarning( "Insert key pressed..." );
default:
break;
}
 
QTableView::keyPressEvent( e );
}
};
 
int main( int argc, char** argv )
{
QApplication app( argc, argv );
 
TableView tv;
 
QStandardItemModel model;
tv.setModel( &model );
 
QStringList colorNames = QColor::colorNames();
 
model.insertColumns( 0, 1 );
model.insertRows( 0, colorNames.size() );
 
model.setHeaderData( 0, Qt::Horizontal,
"Known Colors", Qt::DisplayRole );
 
for( int i = 0; i < colorNames.size(); ++i )
{
QModelIndex index( model.index( i, 0, QModelIndex() ) );
model.setData( index, colorNames[i], Qt::DisplayRole );
model.setData( index, QColor( colorNames[i] ), Qt::DecorationRole );
}
 
tv.show();
return app.exec();
}
 
С Insert никаких проблем нет.


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: panAlexey от Октябрь 19, 2011, 13:07
Вот работающий пример:

С Insert никаких проблем нет.
У меня тоже нет. В смысле скомпильнул, попробовал -  нет проблем.


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: panAlexey от Октябрь 19, 2011, 13:08
Я ж те советовал в скан коде позырить, вообще 82 код приходит или нет. В keyPressEvent всмысле.
Не приходит, уже проверил.
ссылка на проект (http://unnstudioreport.googlecode.com/files/uodbmanager.rar)


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: kambala от Октябрь 19, 2011, 14:15
а оператор and в 11 ввели? а то пришлось заменять его на && чтоб проект собрался.

твоя проблема в том, что у тебя инсерт висит на actionNewElement в качестве хоткея - он и перехватывает нажатие.


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: Bepec от Октябрь 19, 2011, 15:20
Вот вот, я тоже так думал :)

Вот только проект не захотел запускаться - версии dll'ok его не устроили )


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: panAlexey от Октябрь 19, 2011, 20:19
твоя проблема в том, что у тебя инсерт висит на actionNewElement в качестве хоткея - он и перехватывает нажатие.
О, спасибо. а я и забыл про эту пиктограмму, к гую хотел потом вернуться - больше дел в других местах было...


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: iroln от Октябрь 19, 2011, 22:17
Bepec

А я бы хотел уточнить по поводу nativeScanCode. Просто тут тоже возникла проблема. Написал программку на PyQt. Собрал её с помощью cx_Freeze в бинарник. Запускаю у себя на машине (Windows 7 ENG), хоткеи работают при любой раскладке, запускаю на целевой машине (там Windows 7 RUS), хоткеи отваливаются на русской раскладке (прямо как в GTK+ программах). Я вот теперь сижу туплю, то ли это проблема появилась при сборке, то ли изначально в Qt сидит. Думаю, попробовать нативные коды, но это ж надо всё переписывать, а у меня там не один обработчик keyEvent. У вас подобная проблема с хоткеями и раскладками была?


Название: Re: почему QTableView может не ловить Qt::Key_Insert?
Отправлено: Bepec от Октябрь 20, 2011, 07:05
Я ж писал, если использовать Qt::клавиша "какая-то", то на русских версиях ОС оно будет игнорировать русскую раскладку. Вообще.

Нативные же коды не меняются (стандарт они.) Разве что для мультимедийных клавиш могут изменяться.

Потому я уже давно енумчик со скан кодами делаю на такой случай. То же самое получается, только не зависит от версии ОС и прочая :)