Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: catprog от Ноябрь 30, 2009, 17:17



Название: Контекстное меню в QTableWidget
Отправлено: catprog от Ноябрь 30, 2009, 17:17
??? а как его создать? Какой компонент взять? Так чтобы по клику правой кнопкой миши на таблице появлялось контекстное меню с моими пунктами, а лучше по клику на ячейке или строке.


Название: Re: Контекстное меню в QTableWidget
Отправлено: BRE от Ноябрь 30, 2009, 17:21
Посмотри на:
void QAbstractScrollArea::contextMenuEvent ( QContextMenuEvent * e )   [virtual protected]


Название: Re: Контекстное меню в QTableWidget
Отправлено: MoPDoBoPoT от Ноябрь 30, 2009, 17:36
Еще можно использовать QWidget::customContextMenuRequested() + Qt::CustomContextMenu.
Координаты точки расчитываются относительно viewport: tableView->viewport()->mapToGlobal(point)


Название: Re: Контекстное меню в QTableWidget
Отправлено: catprog от Ноябрь 30, 2009, 17:59
Спасибо, попробую


Название: Re: Контекстное меню в QTableWidget
Отправлено: panAlexey от Ноябрь 30, 2009, 18:23
??? а как его создать? Какой компонент взять?
Мы родом из дельфи? Мануалов не чтем? :)


Название: Re: Контекстное меню в QTableWidget
Отправлено: catprog от Ноябрь 30, 2009, 18:45
Мы родом из дельфи? Мануалов не чтем? :)
Да, первый кнопочный язык который учил, чтем, но там много и много сложно понятного, например нашол QMenu, но это похоже не то.


Название: Re: Контекстное меню в QTableWidget
Отправлено: BRE от Ноябрь 30, 2009, 18:47
Да, первый кнопочный язык который учил, чтем, но там много и много сложно понятного, например нашол QMenu, но это похоже не то.
То, посмотри примеры, вместе с Qt их идет множество и во многих используется контекстное меню.


Название: Re: Контекстное меню в QTableWidget
Отправлено: s.c.o.r.p.i.o.n. от Ноябрь 30, 2009, 20:51
а можете ткунть пальцем в какой нибудь пример? а то из стандартных я не нашел с контекстным меню


Название: Re: Контекстное меню в QTableWidget
Отправлено: lit-uriy от Ноябрь 30, 2009, 21:20
пример (http://trac.assembla.com/ysoft/browser/TableViewBuddy/tag/tvb-1.2.0/tableviewbuddy.cpp)


Название: Re: Контекстное меню в QTableWidget
Отправлено: NicK от Ноябрь 30, 2009, 21:56
Код:
contextMNU=new QMenu();
contextMNU->addAction(actSomeAction);

Код:
TABLE_VIEW=new QTableView();
TABLE_VIEW->setContextMenuPolicy(Qt::CustomContextMenu);
connect(TABLE_VIEW, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(slotShowContextMenu(const QPoint &)));


Код:
void slotShowContextMenu(const QPoint &pos)
{
        contextMNU->exec(TABLE_VIEW->mapToGlobal(pos));
}


Название: Re: Контекстное меню в QTableWidget
Отправлено: gmorgunov от Декабрь 01, 2009, 06:45
Вот рабочий код, откопилируйте/запустите, думаю станет понятнее:
tablewidget.h
Код:
#ifndef TABLEWIDGET_H
#define TABLEWIDGET_H
//
#include <QtGui>
class QMenu;
class QAction;
class TableWidget : public QTableWidget
{
    Q_OBJECT
public:
     TableWidget(int, int );
protected:
     void contextMenuEvent(QContextMenuEvent *event);
private slots:
     void add();
     void remove();
private:
     void createActions();
     QAction *addAct;
     QAction *removeAct;
};
#endif
tablewidget.cpp
Код:
#include "tablewidget.h"
//-----------------------------------------------------------------------------------------------
TableWidget::TableWidget(int rows, int columns ) : QTableWidget( rows, columns)
{
    setRowCount(rows);
    setColumnCount(columns);
   
    for (int i  = 0; i < rows; ++i) {
            QTableWidgetItem *item = new QTableWidgetItem(QString("Element")+QString::number(i));
            setItem( i-1 , 1, item);
   }
   
    createActions();
}
//-----------------------------------------------------------------------------------------------
 void TableWidget::createActions()
 {
     addAct = new QAction(tr("Add"), this);
     connect(addAct, SIGNAL(triggered()), this, SLOT(add()));
     removeAct = new QAction(tr("Remove"), this);
     connect(removeAct, SIGNAL(triggered()), this, SLOT(remove()));
}
//-----------------------------------------------------------------------------------------------
void TableWidget::add()
 {
     qDebug() << "add"<< currentRow()<< currentColumn();
 }
//-----------------------------------------------------------------------------------------------
void TableWidget::remove()
 {
     qDebug() << "remove"<< currentRow() << currentColumn();
 }
//-----------------------------------------------------------------------------------------------
void TableWidget::contextMenuEvent(QContextMenuEvent *event)
 {
     QMenu menu(this);
     menu.addAction(addAct);
     menu.addAction(removeAct);
     menu.exec(event->globalPos());
 }
main.cpp
Код:
#include "tablewidget.h"
//
int main(int argc, char ** argv)
{
QApplication app( argc, argv );
TableWidget table(3,1);
table.show();
return app.exec();
}


Название: Re: Контекстное меню в QTableWidget
Отправлено: core от Октябрь 19, 2010, 17:20
Есть void contextMenuEvent( QContextMenuEvent * e ); в хидере

есть

 QObject::connect (ui->tableWidget,SIGNAL(customContextMenuRequested(const QPoint &)),this,SLOT(contextMenuEvent(QContextMenuEvent*)));
 и

 
Код:
  void MainWindow::contextMenuEvent( QContextMenuEvent * e )
    {

        QAction *pRemoveAction = new QAction("Видалити",this);
            connect(pRemoveAction ,SIGNAL(triggered()),this,SLOT(toolButton_DeleteTrack_Clicked()));
            //
            QMenu *pContextMenu = new QMenu( this);
            pContextMenu->addAction(pRemoveAction );
            //
            pContextMenu->exec( e->globalPos() );

            delete pContextMenu;
            pContextMenu = NULL;
}

код работает, но нужно, что менюшка была привязана к таблице (отображалась при правом клике только на таблицу) + проверять, произведен ли клик по ячейк или просто по таблице. подозреваю что привязка к таблице осуществляется через exec, но как конкретно ето сделат не знаю. С кликом на ячейке еще больше проблем. Помогите, кто знает как


Название: Re: Контекстное меню в QTableWidget
Отправлено: GreatSnake от Октябрь 19, 2010, 19:19
QTableWidgetItem* itemAt( const QPoint& point ) const
Позицию брать из e->pos().


Название: Re: Контекстное меню в QTableWidget
Отправлено: core от Октябрь 19, 2010, 19:42
извиняюсь за нубство. а можна подробнее?