如何在Qt中使函数成为时间槽?

use*_*020 3 c++ qt slot

要使类的函数成为一个槽,该类必须从QObject继承.但是,QObject占用了相当大的内存.我不确定它是多少以及内存是针对每个类还是每个对象.我的代码有许多小数据,其功能有时可以是一个插槽.我很想知道是否有一种方法可以在使用它时使类的功能成为时间槽.使用后,将删除插槽成本的内存.以下代码说明了该要求.

class SmallData // size of 2 or 3 integers.
{
public:
    virtual void F(); // use it as a slot.
    virtual QMenu* createMenu(); // use this to create the context menu with
                                 // an action connected to F()
    ...
};

// use the small data
vector<SmallData> vec(1000000); // the vector is put at a tree view. When an
                                // item in the tree view is selected, a context
                                // menu pop up with an action to run F().
SmallData* data = treeView.selectedItem();    
connect(action, SIGNAL(triggered()), data, SLOT(F())); // How to make F() to be
                                                       // a slot just here.
                                                       // The action is from 
                                                       // data->createMenu().
Run Code Online (Sandbox Code Playgroud)

hyd*_*yde 8

如果你可以使用Qt5,你可以将信号连接到普通函数和静态方法(基本上有趣地命名为普通函数):

connect(action, &QAction::triggered, 
        &SmallData::statF); 
Run Code Online (Sandbox Code Playgroud)

哪里action是一个QAction实例,SmallData::statF是一个静态方法SmallData.

根据Christian Rau的评论编辑,调用特定的实例,你也可以连接到lambda:

connect(action, &QAction::triggered,
        [data]() { data->F(); });
Run Code Online (Sandbox Code Playgroud)

已经使用Qt4,您可以使用QSignalMapper更多对象来实现更多相同的效果.它允许您vec根据发出它的对象添加一个参数(在这种情况下,可能是您的整数索引)来发信号.但是在Qt4中,接收器仍然必须始终是QObject.

  • @hyde看到我的评论,你至少可以使用`tr1 :: bind`(虽然我猜`std :: bind`也应该工作)或者捕捉lambda(`connect(动作,&QAction ::触发,[数据] (){data-> F();});`),不需要任何静态垃圾. (2认同)