Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] QMouseEvent, на своей имплементации QFrame 
:(
    Опции темы
Mal Hack
Дата 11.9.2008, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Доброе. Подскажите.
Есть своя имплементация QFrame, на котором есть еще виджеты.
Переопределяю: void myQFrame::mousePressEvent(QMouseEvent *event);
Вставляю в protected, хотя влиять не должно.
В общем, куда бы я не щелках, обработчик просто не вызывается...
По хорошему, в этом QFrame есть QTableWidget (создаются в дизайнере), и вот надо обрабатывать клик на элементах таблицы (элементы создаются кодом - динамически).

Куда копать, чтоб реализовать?

Спасибо.
PM ICQ   Вверх
SABROG
Дата 11.9.2008, 23:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Неужто сигналов не хватает ?

Код

void cellActivated ( int row, int column )
void cellChanged ( int row, int column )
void cellClicked ( int row, int column )
void cellDoubleClicked ( int row, int column )
void cellEntered ( int row, int column )
void cellPressed ( int row, int column )
void currentCellChanged ( int currentRow, int currentColumn, int previousRow, int previousColumn )
void currentItemChanged ( QTableWidgetItem * current, QTableWidgetItem * previous )
void itemActivated ( QTableWidgetItem * item )
void itemChanged ( QTableWidgetItem * item )
void itemClicked ( QTableWidgetItem * item )
void itemDoubleClicked ( QTableWidgetItem * item )
void itemEntered ( QTableWidgetItem * item )
void itemPressed ( QTableWidgetItem * item )
void itemSelectionChanged ()



--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Fin
Дата 12.9.2008, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: нет
Всего: 10



Ну а если чисто с теоретической стороны, то можно поставить фильтры. Вот выписка из книжки по Qt4 на этот счет
Цитата

Setting up an event filter involves two steps:
  1. Register the monitoring object with the target object by calling install-
     EventFilter() on the target.
  2. Handle the target object’s events in the monitor’s eventFilter() function.
A good place to register the monitoring object is in the CustomerInfoDialog con-
structor:
     CustomerInfoDialog::CustomerInfoDialog(QWidget *parent)
         : QDialog(parent)
     {
         •••
         firstNameEdit->installEventFilter(this);
         lastNameEdit->installEventFilter(this);
         cityEdit->installEventFilter(this);
         phoneNumberEdit->installEventFilter(this);
     }
Once the event filter is registered, the events that are sent to the firstName-
Edit, lastNameEdit, cityEdit, and phoneNumberEdit widgets are first sent to the
CustomerInfoDialog’s eventFilter() function before they are sent on to their in-
tended destination.
Here’s the eventFilter() function that receives the events:
     bool CustomerInfoDialog::eventFilter(QObject *target, QEvent *event)
     {
         if (target == firstNameEdit || target == lastNameEdit
                 || target == cityEdit || target == phoneNumberEdit) {
             if (event->type() == QEvent::KeyPress) {
                 QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
                 if (keyEvent->key() == Qt::Key_Space) {
                      focusNextChild();
                      return true;
                 }
             }
         }
         return QDialog::eventFilter(target, event);
     }



--------------------
Пролетал мимо.
PM MAIL   Вверх
Mal Hack
Дата 13.9.2008, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Цитата(SABROG @  12.9.2008,  00:21 Найти цитируемый пост)
Неужто сигналов не хватает ?

Нужно отловить именно правый клик, чтоб popup меню показать.

Цитата(Fin @  12.9.2008,  01:20 Найти цитируемый пост)
Ну а если чисто с теоретической стороны, то можно поставить фильтры. Вот выписка из книжки по Qt4 на этот счет

Для моей задачи (см. 2 строки выше), имхо, это слишком громоздкий вариант с точки зрения того, что eventFilter так или иначе, но будет "ловить"  все события, что не рационально.
PM ICQ   Вверх
SABROG
Дата 13.9.2008, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Я такой слот создавал. 

Код

void MyMainWindow::on_tablewidgetMy_customContextMenuRequested(const QPoint& pos)
{
    QModelIndex ind = tablewidgetMy->indexAt(pos);
    QPoint gPos = tablewidgetMy->mapToGlobal(pos);
    if (ind.isValid())
    {
        rootMenu->exec(gPos); // вызываем одно меню, скажем работа с итемам (Добавить, удалить, копировать и т.д)
    }
    else
    {
        addMenu->exec(gPos); // а это меню вызываем, если кликнули на область где нет итемов, чтобы добавить их
    }
}


Возможно в QTableWidget еще надо будет свойство поменять, чтобы испускался сигнал customContextMenuRequested.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
Fin
Дата 13.9.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: нет
Всего: 10



Ну для простого контекстного меню. Выписка из той же книжки
Цитата

    void MainWindow::createContextMenu()
    {
        spreadsheet->addAction(cutAction);
        spreadsheet->addAction(copyAction);
        spreadsheet->addAction(pasteAction);
        spreadsheet->setContextMenuPolicy(Qt::ActionsContextMenu);
    }
Any Qt widget can have a list of QActions associated with it. To provide a
context menu for the application, we add the desired actions to the Spreadsheet
widget and set that widget’s context menu policy to show a context menu with
these actions. Context menus are invoked by right-clicking a widget or by
pressing a platform-specific key.



Это сообщение отредактировал(а) Fin - 13.9.2008, 11:50


--------------------
Пролетал мимо.
PM MAIL   Вверх
Mal Hack
Дата 14.9.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



А как мне это с QTableWidget увязать?
PM ICQ   Вверх
Fin
Дата 14.9.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: нет
Всего: 10



Кстати в книге spreadsheet и есть потомок от QTableWidget. Просто к нему подключаеш объекты QAction и говориш, что для контекстного меню надо использовать лист этих объектов. 

Вот эта книга http://trolltech.com/developer/books/2 Раньше они давали скачать книгу. Сейчас только купить :( 

Это сообщение отредактировал(а) Fin - 14.9.2008, 16:18


--------------------
Пролетал мимо.
PM MAIL   Вверх
Mal Hack
Дата 29.9.2008, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Продолжаем разговор smile)

Итак. Сделал так. Создал в конструкторе QMenu, настроил все QAction. Все работает.
При клике на таблице выделяется строка, и я сохраняю ее номер в переменную (для любой работы пункта меню необходимо знать одно из значений в выделенной строке).
Переопределил contextMenuEvent(), в котором показываю menu.exec().

Фишка в чем. Вот кликнул я правой кнопкой мыши на какой-то строке, меню появилось, все хорошо. Теперь, если я хочу кликнуть на другой строчке, то у меня меню вызванное в предыдущий раз - закрывается, выделения новой строчки не происходит, и новое меню вызывается для старой выделенной строки.

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

Как победить?

В качестве пояснения. Есть TForm (QFrame) и contextMenuEvent() определен для него. Таблица - TForm.tblWidget.

Спасибо.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0542 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.