Проблема в получении mouseEvent
на QTableWidget
, этот код для создания окна с tabelwidget
а также mouseclickevent
, когда я нажимаю правую кнопку мыши, я получаю две опции действия, называемые «добавить» и «удалить»,
я хочу добавить новые строки с 3 столбцами, когда я нажимаю «добавить» функцию события, и удалить последнюю строку, когда я нажимаю «удалить» функцию события,
(извините за мой английский), любая помощь приветствуется.
#include "notepad.h"#include <QMessageBox>
#include <QTableView>
#include <QMouseEvent>
Notepad::Notepad()
{
test() ;
add_action = new QAction(tr("Add cell"), this);
add_action->setIcon(QIcon("add.jpg"));
Delete_action = new QAction(tr("Delete cell"), this);
Delete_action->setIcon(QIcon("delete.jpg"));
connect(Delete_action, SIGNAL(triggered()), this, SLOT(Delete()));
connect(add_action, SIGNAL(triggered()), this, SLOT(add()));
centralWidget()->setAttribute(Qt::WA_TransparentForMouseEvents);
centralWidget()->setAttribute(Qt::WA_MouseTracking,true);
setMouseTracking(true);
}
void Notepad::test()
{
QTableWidget* table = new QTableWidget();
QTableWidgetItem* tableItem = new QTableWidgetItem();
table->setRowCount(1);
table->setColumnCount(3);
table->setItem(0,0,new QTableWidgetItem());
table->setItem(0,1,new QTableWidgetItem());
table->setItem(0,2,new QTableWidgetItem());
table->setMouseTracking(true);
table->viewport()->setMouseTracking(true);
table->installEventFilter(this);
table->viewport()->installEventFilter(this);
table->setSelectionBehavior(QAbstractItemView::SelectRows);
table->setSelectionMode(QAbstractItemView::SingleSelection);
tableItem->setFlags(tableItem->flags() ^ Qt::ItemIsEditable);
table->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
setCentralWidget(table);}
void Notepad::mouseReleaseEvent (QMouseEvent * event )
{QMessageBox* msgBox;
if(event->button() == Qt::RightButton)
{
QMouseEvent *mouseEvent = static_cast<QMouseEvent*> (event);
QMenu *menu = new QMenu(this);
menu->addAction(add_action);
menu->addAction(Delete_action);
menu->exec(mouseEvent->globalPos());
}
}
void Notepad::add()
{
QTableWidget* table = new QTableWidget();
test();
table->setColumnCount(3);*/int newRow = table->rowCount();
int newcol = table->columnCount();
qDebug() << newRow;
for (int row ; row < newRow+1 ; ++row)
{
QWidget *parent;
QStyleOptionViewItem option;
for (int column = 0; column < 3; ++column)
{
table->insertRow( table->rowCount());
table->insertColumn( newcol );
}
}
setCentralWidget(table);
centralWidget()->setAttribute(Qt::WA_TransparentForMouseEvents);
setMouseTracking(true);
}
void Notepad::Delete()
{
QTableWidget* table = new QTableWidget();
add();
int row=table->rowCount();if (int i= row){
table->removeRow(i);
}
setCentralWidget(table);
centralWidget()->setAttribute(Qt::WA_TransparentForMouseEvents);
setMouseTracking(true);
}
У вас есть 2 вопроса в одном: как создать контекстное меню и как добавить строку.
Шаг 1: создать меню один раз. В конструкторе, например.
// _menu is a class member.
_menu = new QMenu(this);
_menu->addAction(add_action);
_menu->addAction(Delete_action);
Шаг 2: показать это в соответствующем событии:
void Notepad::contextMenuEvent(QContextMenuEvent *event)
{
_menu->exec(event->globalPos());
}
Во-первых, вам нужен стол в качестве члена класса. Почему вы создаете новый экземпляр каждый раз? Это разные объекты! Вы создаете новый виджет таблицы на каждом add
вызов!
Во-вторых, вам нужно увеличить количество строк и заполнить новую строку:
void Notepad::add()
{
const int newIndex = _table->rowCount();
_table->setRowCount(newIndex + 1);
// Fill data in row with index newIndex.
...
}
Других решений пока нет …