问:调整信号/绑定参数到插槽?

Bkl*_*lyn 3 c++ qt boost

有没有办法将参数绑定到插槽ala boost :: bind

这是一个例子.我有一个带树视图的窗口,我想允许用户从上下文菜单中隐藏一列.我最终做了类似的事情:

void MyWindow::contextMenuEvent (QContextMenuEvent* event) {
   m_column = view->columnAt (event->x());
   QMenu menu;
   menu.addAction (tr ("Hide Column"), this, SLOT (hideColumn ()));
   // .. run the menu, etc
}
Run Code Online (Sandbox Code Playgroud)

我需要捕获激活上下文菜单的列的索引,并将其存储在我的窗口hideColumn槽使用的成员变量中:

void MyWindow::hideColumn () {
    view->setColumnHidden (m_column, true);
}
Run Code Online (Sandbox Code Playgroud)

我真正喜欢的是能够在创建菜单时将列号绑定到我的插槽,所以我不需要这个成员变量.基本上Qt相当于:

menu.addAction (tr ("Hide Column"),
                boost::bind (&MyWindow::hideColumn, this,
                             event->columnAt (event->x()));
Run Code Online (Sandbox Code Playgroud)

甚至更好的适应的QAction ::触发信号,并将其连接到QTreeView则:: hideColumn插槽,这需要列索引作为参数:

menu.addAction (tr ("Hide Column"),
                boost::bind (&QTreeView::hideColumn, view,
                             event->columnAt (event->x())));
Run Code Online (Sandbox Code Playgroud)

这有可能吗?

Kal*_*son 6

LibQxt通过QxtBoundFunction和QxtMetaObject使这成为可能(前者由于某种原因没有出现在他们的文档中).这是一个开源项目,如果您对实现感兴趣,可以获取源代码.它使用以下语法:

connect(
    button,
    SIGNAL(clicked()),
    QxtMetaObject::bind(
        lineEdit,
        SLOT(setText(QString)),
        Q_ARG(QString, "Hello World!)
        )
    );
Run Code Online (Sandbox Code Playgroud)

LibQxt还有一些非常有用的功能,例如通过QIODevice发出信号的能力,例如网络连接.


小智 6

你不能使用的setData功能QAction吗?

void MyWindow::contextMenuEvent (QContextMenuEvent* event)
{
    m_column = view->columnAt (event->x());
    QMenu menu;
    QAction * action = menu.addAction (tr ("Hide Column"), this, SLOT (hideColumn ()));
    action->setData(QVariant(hideColumn));
}

void hideColumn()
{
    const QAction * action = qobject_cast<const QAction *>(this->sender());
    assert(action);

    int hide_column = action->data().value<int>();
    this->view->setColumnHidden (m_column, true);
}
Run Code Online (Sandbox Code Playgroud)

  • 不错.不知道setData.现在可以在Qt 5中使用C++ 0x lambdas,这种混乱可能都会消失.好极了! (2认同)