【问题标题】:Qt/C++: QTableView contextmenu and passing through informationQt/C++:QTableView 上下文菜单和传递信息
【发布时间】:2011-05-20 08:21:47
【问题描述】:

我想在我的 QTableView 中的单元格上有一个上下文菜单,所以我首先连接:

connect(ui->tblTimesheet,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(sheetContextMenu(const QPoint &)));

该连接的插槽如下:

void wndMyWindow::sheetContextMenu(const QPoint &pos){
    QMenu *menu = new QMenu;
    QModelIndex cell = ui->tblTimesheet->indexAt(pos);
    // Make sure the right click occured on a cell!
    if(cell.isValid()){
        QString myid=cell.sibling(cell.row(),0).data().toString();
        menu->addAction("Remove item", this, SLOT(sheetRemoveItem()));
        menu->exec(ui->tblTimesheet->mapToGlobal(pos));
    }
}

它创建菜单并在菜单中放置一个操作,当单击该操作时调用一个函数。但是,我想通过变量 myid 进入第二个插槽。下面列出了该插槽:

void wndMyWindow::sheetRemoveItem(){
    qDebug("Sure I'm here, but what info do I have?");
    return;
}

我不太清楚该怎么做,有人可以帮忙吗?

【问题讨论】:

    标签: c++ qt signals argument-passing


    【解决方案1】:

    在这方面,与回调和其他信号/插槽机制相比,Qt 信号/插槽很糟糕。你真的不能附加额外的信息。

    你可以做几件事:

    1. 创建一个对象来存储您要发送的信息,给它一个插槽并附加到您要响应的信号,发出带有信息的新信号,附加到该信号。

    2. 使用 Qt 信号图将一些小的数据变化附加到信号。

    3. 您可以在 Qt 插槽中获取发件人。这可能是您需要的信息。 (请参阅有关信号/插槽的 Qt 文档)。

    如果这些方法都不适合你,很抱歉,但你已经很糟糕了。我正在研究一种自动创建 #1 并附加到 boost::signal 的方法,这会更强大,但由于 Qt 与 C++ 预处理器和模板不兼容,因此需要大量的工作。

    祝你好运。

    【讨论】:

    • 是的,我环顾四周的次数越多,看起来就越不可能——这看起来很愚蠢,因为上下文菜单的全部意义不在于能够对特定的小部件执行某些操作吗?如果我想要一个全局操作,我会使用常规菜单或其他类型的界面小部件!我所做的是给我的表格一个私人成员 QModelIndex lastCellRightClicked;我将它设置在 void wndMyWindow::sheetContextMenu(const QPoint &pos) 插槽中,然后在 void wndMyWindow::sheetRemoveItem() 插槽中使用它。足够好™。
    • 如果你只是想为一个特定的菜单项实现一些特定的东西,你想做的就是附加到项目的 QAction。
    【解决方案2】:

    阅读上一个答案后,我意识到您实际上可以将一些数据附加到发件人。我在我的代码中这样做。

    从 QObject 继承的每个对象都有“setProperty()”。在这里您可以在它开始发送信号之前设置一些数据。在我的一个插槽中,我执行以下操作:

    qobject_cast<QAction*>(sender())->property("index").toInt()
    

    这允许我将索引附加到我的操作。

    【讨论】:

    • 或者你可以只使用 QAction::setData() / QAction::data() 方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多