Russian Qt Forum

Qt => Вопросы новичков => Тема начата: YvenTitan от Февраль 03, 2017, 11:49



Название: Действия по нажатию правой кнопки мыши на элемент QAbstractTableModel
Отправлено: YvenTitan от Февраль 03, 2017, 11:49
Здравствуйте
У меня есть QAbstractTableModel, установленная в QTableView. Я хочу, чтобы по нажатию правой кнопкой мыши на определенный элемент модели кое-что происходило (в моем случае появлялось некое меню).
Можете подсказать, как это сделать?


Название: Re: Действия по нажатию правой кнопки мыши на элемент QAbstractTableModel
Отправлено: GreatSnake от Февраль 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() );
   } );


Название: Re: Действия по нажатию правой кнопки мыши на элемент QAbstractTableModel
Отправлено: ssoft от Февраль 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 )
 


Название: Re: Действия по нажатию правой кнопки мыши на элемент QAbstractTableModel
Отправлено: YvenTitan от Февраль 03, 2017, 12:53
Спасибо большое


Название: Re: Действия по нажатию правой кнопки мыши на элемент QAbstractTableModel
Отправлено: kambala от Февраль 03, 2017, 15:54
вариант 1 можно сделать без наследования через eventFilter