customContextMenuRequest(const QPoint&) want to have customContextMenuRequest(const QPoint&, QTableV

customContextMenuRequested(const QPoint&) want to have customContextMenuRequested(const QPoint&, QTableView)

本文关键字:customContextMenuRequest QPoint const QTableV have want to      更新时间:2023-10-16

我被困在一个问题上,我不知道如何解决它。问题是,我想让我正在使用的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);
}

听起来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);
}

您可以使用QObject::sender()获得在showMenu()中发出信号的对象,然后使用qobject_cast<QTableView*>将返回的对象强制转换为QTableView。(访问前不要忘记检查强制转换的结果——如果失败,qobject_cast返回0)

看到http://qt project.org/doc/qt - 4.8 -/- qobject.html #发送者

相关文章:
  • 没有找到相关文章