如何将新行添加到现有的 QTablewidget
Posted
技术标签:
【中文标题】如何将新行添加到现有的 QTablewidget【英文标题】:How can i add new row to the existing QTablewidget 【发布时间】:2016-08-25 10:36:27 【问题描述】:在QTableWidget
上获取mouseEvent
时出现问题,此代码是用tabelwidget
和mouseclickevent
创建一个窗口,当我单击鼠标右键时,我得到两个名为“add”和“的操作事件选项删除”,
我想在单击“添加”事件函数时添加 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);
【问题讨论】:
QWidget
s 有专门的contextMenuEvent
用于此类操作。但是有什么问题呢?
我想在每次单击添加事件时添加一个包含 3 列的新行,因为从早上开始我就很挣扎,但我没有得到任何解决方案,请帮我找到解决方案。
如果您想将行数增加一,只需使用table->setRowCount(table->rowCount() + 1)
。这不是你要找的吗?
【参考方案1】:
你有两个问题合二为一:如何创建上下文菜单以及如何添加行。
如何创建上下文菜单。
第 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.
...
【讨论】:
以上是关于如何将新行添加到现有的 QTablewidget的主要内容,如果未能解决你的问题,请参考以下文章