要使类的函数成为一个槽,该类必须从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)
如果你可以使用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.