Russian Qt Forum
Май 03, 2024, 01:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Действия по нажатию правой кнопки мыши на элемент QAbstractTableModel  (Прочитано 4447 раз)
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« : Февраль 03, 2017, 11:49 »

Здравствуйте
У меня есть QAbstractTableModel, установленная в QTableView. Я хочу, чтобы по нажатию правой кнопкой мыши на определенный элемент модели кое-что происходило (в моем случае появлялось некое меню).
Можете подсказать, как это сделать?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Февраль 03, 2017, 12:29 »

Код
C++ (Qt)
your_table_view->setContextMenuPolicy( Qt::CustomContextMenu );
QObject::connect( your_table_view, &QWidget::customContextMenuRequested, [ & ]( const QPoint& pos ) {
       QModelIndex mi = your_table_view->indexAt( pos );
       if( !mi.isValid() )
   return;
       QMenu menu;
       <...>
       QAction* a = menu.exec( QCursor::pos() );
   } );
Записан

Qt 5.11/4.8.7 (X11/Win)
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #2 : Февраль 03, 2017, 12:35 »

Здравствуйте
У меня есть QAbstractTableModel, установленная в QTableView. Я хочу, чтобы по нажатию правой кнопкой мыши на определенный элемент модели кое-что происходило (в моем случае появлялось некое меню).
Можете подсказать, как это сделать?

Вариант 1.
Необходимо пронаследовать свой View от QTableView и переопределить виртуальные методы обработки событий

Код
C++ (Qt)
virtual void dragEnterEvent ( QDragEnterEvent * event )
virtual void dragLeaveEvent ( QDragLeaveEvent * event )
virtual void dragMoveEvent ( QDragMoveEvent * event )
virtual void dropEvent ( QDropEvent * event )
virtual bool event ( QEvent * event )
virtual void focusInEvent ( QFocusEvent * event )
virtual bool focusNextPrevChild ( bool next )
virtual void focusOutEvent ( QFocusEvent * event )
virtual void inputMethodEvent ( QInputMethodEvent * event )
virtual void keyPressEvent ( QKeyEvent * event )
virtual void mouseDoubleClickEvent ( QMouseEvent * event )
virtual void mouseMoveEvent ( QMouseEvent * event )
virtual void mousePressEvent ( QMouseEvent * event )
virtual void mouseReleaseEvent ( QMouseEvent * event )
virtual void resizeEvent ( QResizeEvent * event )
virtual void timerEvent ( QTimerEvent * event )
virtual bool viewportEvent ( QEvent * event )
 

Вариант 2.
Присоединиться к сигналам QAbstractItemView (он  же QTableView) и обрабатывать их, определяя по косвенным признакам, что произошло

Код
C++ (Qt)
void activated ( const QModelIndex & index )
void clicked ( const QModelIndex & index )
void doubleClicked ( const QModelIndex & index )
void entered ( const QModelIndex & index )
void pressed ( const QModelIndex & index )
void viewportEntered ()
 

Вариант 3.
Если нужно только контекстное меню, то присоединиться к сигналу QWidget

Код
C++ (Qt)
void customContextMenuRequested ( const QPoint & pos )
 
« Последнее редактирование: Февраль 03, 2017, 12:37 от ssoft » Записан
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« Ответ #3 : Февраль 03, 2017, 12:53 »

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

Сообщений: 4727



Просмотр профиля WWW
« Ответ #4 : Февраль 03, 2017, 15:54 »

вариант 1 можно сделать без наследования через eventFilter
Записан

Изучением 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.205 секунд. Запросов: 23.