customContextMenuRequested(const QPoint&)想要customContextMenuRequested(const QPoint&,QTableView)

时间:2014-05-15 08:49:05

标签: c++ qt

我遇到了一个问题,我不知道如何解决它。 问题是我希望将我正在使用的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);
}

2 个答案:

答案 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)

请参阅http://qt-project.org/doc/qt-4.8/qobject.html#sender