使用 connect 方法连接到一个插槽
Posted
技术标签:
【中文标题】使用 connect 方法连接到一个插槽【英文标题】:Using connect method to connect to a slot 【发布时间】:2016-05-20 05:35:17 【问题描述】:我正在构建一个需要 Qdialog 和几个按钮的应用程序。
我正在尝试在我的实现中使用命令行为设计模式。到目前为止,我的项目有 4 个课程。 (请原谅粗暴的UML)
Command
+execute()
zoomInAndOut : Command
+execute()
MenuItem
-QPushButton
-command
+clicked()
Dialog
所以在对话框类中,我创建了一个 menuItem(它有一个 QPushButton 和 Command 成员变量),我需要做的是,当 menuItems 按钮被点击时,它会调用 menuItems “clicked”方法(它依次调用命令执行方法)。我知道必须使用“连接”功能,但是经过多次尝试后,我无法使其正常工作。
Dialog中的代码大致是这样的
zoomInAndOut zoomCommand;
menuItem *zoom = new menuItem(new QPushButton("Zoom", this), QRect(QPoint(300, 0), QSize(100, 50)), &zoomCommand);
connect(zoom->getButton(), SIGNAL(clicked()), SLOT(zoom->clicked()));
如前所述,连接方法是完全错误的,但您可以看到我试图实现的目标。我怎样才能做到这一点?
提前感谢您的帮助。
【问题讨论】:
返回什么按钮缩放?请出示代码。 【参考方案1】:更改代码
connect(zoom->getButton(), SIGNAL(clicked()), SLOT(zoom->clicked()));
到
connect(zoom->getButton(), SIGNAL(clicked()), zoom, SLOT(clicked()));
【讨论】:
嗨!尝试此操作时会导致编译错误:“第三个参数没有从 'menuItem * ' 到 'const QObject *' 的已知转换。 好的。你在getButton()
方法上返回了什么?
zoom 的方法 clicked()
是否在 zoom 类的 public slots:
部分中?
是的。我添加了你和 Aarons 的解决方案。现在让我想到了这个:imgur.com/WPVHLRY
好吧,添加#include <QPushButton>
到类【参考方案2】:
确保您的 menuItem 类在打开 之后的行包含
Q_OBJECT
宏。并确保clicked()
方法位于类主体的slots
部分中。
【讨论】:
嗨!我从来没有听说过这样做,但我能够在快速谷歌搜索后添加它。这导致了以下屏幕截图:imgur.com/WPVHLRY 我非常有信心我正确添加了宏,但是在尝试编译时我收到编译器链接器错误,您可以在屏幕截图的底部看到。 如果你删除宏,它会编译吗? (但你需要它让 SIGNAL 和 SLOTS 在 menuItem 中工作) 你应该把你的类声明放在头文件中。是吗? O_OBJECT 在 cpp 文件中不起作用。另见***.com/questions/4774291/… 嗨 Aaron,您的解决方案和@someoneinthebox 解决方案的组合使程序可以编译。感谢您的帮助!以上是关于使用 connect 方法连接到一个插槽的主要内容,如果未能解决你的问题,请参考以下文章
如何修复QObject::connect:没有这样的插槽..将发送者连接到同一类中的插槽时[重复]