我遇到了一个问题,我不知道如何解决它。 问题是我希望将我正在使用的QTableView对象发送到下一个函数。这样我就不需要为我拥有的所有表复制函数了。我可以创建一个泛型函数并重用它。但要做到这一点,我需要发送QTableView,以便我可以添加我想要添加的行...请查看我的代码看起来如何。代码是我想要的。
void InputWindow::on_pushButton_ViewMilestone_clicked()
{
QTableView *viewMilestone = new QTableView;
viewMilestone->setModel(sourceMilestonesModel);
viewMilestone->setContextMenuPolicy(Qt::CustomContextMenu);
viewMilestone->resizeColumnsToContents();
viewMilestone->setMinimumWidth(getVerticalSizeOfQTableView(viewMilestone));
viewMilestone->show();
connect(viewMilestone, SIGNAL(customContextMenuRequested(const QPoint&)),
this, SLOT(showMenu(const QPoint&)));
}
void InputWindow::showMenu(const QPoint &pos, QTableView *tableView)
{
QAction *insertRowAction = new QAction(this);
insertRowAction->setText("Insert new row");
connect(insertRowAction, SIGNAL(triggered()),
this, SLOT(addNewRow()));
QMenu *rightClickMenu = new QMenu(this);
rightClickMenu->addAction(insertRowAction);
rightClickMenu->popup(tableView->viewport()->mapToGlobal(pos));
}
void InputWindow::addNewRow(QTableView *qTblView)
{
QAbstractItemModel *tableModel = qTblView->model();
int rows = tableModel->rowCount();
tableModel->insertRow(rows);
}
答案 0 :(得分:2)
听起来QSignalMapper在这里可能会有所帮助。它旨在将多个QObject链接到单个插槽,并提供关于源是什么的上下文。它通常比MarioBlueSkies sender()机制更可靠,因为您更明确地控制了对Mapper注册的内容。
像这样......
QSignalMapper *mapper = new QSignalMapper(this);
connect(mapper, SIGNAL(mapped(const QObject&)),
this, SLOT(clicked(const QObject&)));
void InputWindow::on_pushButton_ViewMilestone_clicked()
{
QTableView *viewMilestone = new QTableView;
viewMilestone->setModel(sourceMilestonesModel);
viewMilestone->setContextMenuPolicy(Qt::CustomContextMenu);
viewMilestone->resizeColumnsToContents();
viewMilestone->setMinimumWidth(getVerticalSizeOfQTableView(viewMilestone));
viewMilestone->show();
connect(viewMilestone, SIGNAL(customContextMenuRequested(const QPoint&)), signalMapper, SLOT(map()));
signalMapper->setMapping(viewMilestone, viewMilestone);
}
答案 1 :(得分:0)
您可以使用QObject::sender()
获取在showMenu()
中发出信号的对象,然后使用qobject_cast<QTableView*>
将返回的对象强制转换为QTableView
。
(在访问之前不要忘记检查强制转换的结果 - qobject_cast
如果失败则返回0)