【发布时间】:2015-09-09 12:39:18
【问题描述】:
我正在开发一个图像编辑软件,其中包括一些课程。但我需要我的代码更通用。但是在连接方面,我的课程有一个大问题。
QObject::connect(actionSmartContrast, SIGNAL(triggered(bool)), effectsWindow, SLOT(addSmartContrast()));
QObject::connect(actionSaturation, SIGNAL(triggered(bool)), effectsWindow, SLOT(addSaturation()));
我有一个名为“效果”的菜单,当用户单击QActionactionSmartContrast 时,效果智能对比度将添加到我的效果窗口中。问题是,鉴于每个效果都有自己的类,我必须为每个类创建一个函数,如您在上面的代码中所见。这是非常重复的。我想通过这样做来避免这个问题:
QObject::connect(actionSmartContrast, SIGNAL(triggered(bool)), effectsWindow, SLOT(addEffect(new SmartContrast())));
QObject::connect(actionSaturation, SIGNAL(triggered(bool)), effectsWindow, SLOT(addEffect(new Saturation())));
函数addEffect() 一切正常,因为它需要一个指向 Effect 对象的指针,并且 SmartContrast 和 Saturation 都继承自 Effect。唯一的问题是不可能像这样在connect() 中传递变量。所以我想到了子类化QAction 并创建一个信号,它每次都会返回我喜欢的类,但又一次,如何告诉我的新 Action 类它应该返回什么类?如果我有一千个效果,我不会将QAction 子类化一千次!我需要创建一个函数,例如一个指向SmartContrast 对象的指针,它会猜测每次单击Action 时它都必须返回一个SmartContrast 指针。由于继承自 Effect 类,这仍然是可能的。但我真的不知道该怎么做。任何帮助将非常感激。提前致谢!
【问题讨论】:
-
您可以在插槽中使用 sender() 来获取操作。然后你可以在比较指针时创建相应的效果。或者,如果您可以使用 lambda,您可以在自定义操作类中存储 std::function,例如 smartEffectAction = new myAction([] () { return new SmartEffect(); });然后在槽中调用这个函数来获取正确的对象。
-
你的效果是否有一个通用的基类和虚方法,这样访问基类指针就足够了?
标签: c++ qt class inheritance slot