被 qt 4 信号和槽中的 clicked() 和 clicked(bool) 混淆

Posted

技术标签:

【中文标题】被 qt 4 信号和槽中的 clicked() 和 clicked(bool) 混淆【英文标题】:confused by clicked() and clicked(bool) in qt 4 signal and slot 【发布时间】:2017-12-19 03:40:31 【问题描述】:

我正在使用 qt 4.8.6 和 Visual Studio 2008 开发一个项目,但被 clicked() 和 clicked(bool) 弄糊涂了。在为将发出信号的对象建立连接时:

connect(sender, SIGNAL(clicked(bool)), receiver, SLOT(myslot()));

将触发 myslot();和

connect(sender, SIGNAL(clicked()), receiver, SLOT(myslot()));

不会触发它。但是,我发现其他许多关于连接的示例都使用 clicked() not clicked(bool)。 为什么我不能使用 clicked()? 我通过 Qt Assistant 浏览了一下:

void QAbstractButton::clicked (bool checked = false) [信号]

当按钮被激活(即当鼠标光标在按钮内时按下然后释放),当键入快捷键,或者当 click() 或 animateClick() 被调用时,会发出这个信号。值得注意的是,如果您调用 setDown()、setChecked() 或 toggle(),则不会发出此信号。

如果按钮是可选中的,如果按钮被选中,checked 为真, 如果未选中该按钮,则为 false。

我找不到它的原因。同时,“checked”和“unchecked”有什么区别?

顺便说一句,我通过按下鼠标左键并拖动光标来建立连接。另一种方法是右键单击对象,然后上下文菜单将显示“转到插槽”,但我的 Qt Designer(4.8.6) 不会。 如何处理?

3个问题希望得到帮助。非常感谢。

【问题讨论】:

我看不出你的第一个和第二个连接有什么区别。 对不起,它们被 clicked() 和 clicked(bool) 输入错误。 connect 语句返回什么?它是否返回false 我看不出您提供的代码 sn-ps 不起作用的任何原因,因此您的问题的根源必须在其他地方找到。如果您希望得到有用的答案而不是猜测,请提供minimal reproducible example。如果您的应用程序有任何控制台输出,也会很有趣。并确保阅读并理解Signals & Slots documentation,然后再与他们搞混。 【参考方案1】:

我不确定我是否真的理解这些问题,但是您无法连接到clicked() 信号的原因是因为没有这样的东西......功能配置文件显然是@ 987654326@ (see docs)。

Qt 只会在无法连接信号/插槽时显示运行时错误(qWarning 到 stderr),在编译时并不明显。尝试检查程序输出是否有警告。

编辑:删除误导性信息。

【讨论】:

对不起,我还是一头雾水。我想知道为什么 connect(sender, SIGNAL(clicked(bool)), receiver, SLOT(myslot()));可以触发 myslot() 而 connect(sender, SIGNAL(clicked(), receiver, SLOT(myslot())); 不能这样做。我已阅读有关 void QAbstractButton::clicked(bool checked = false) 但无法找到的文档原因。 我发现很多使用 clicked() not clicked(bool) 的示例代码,例如connect(sourceButton, SIGNAL(clicked()), this, SLOT(chooseSource())); connect(operatorComboBox, SIGNAL(activated(int)), this, SLOT(recalculateResult())); connect(destinationButton, SIGNAL(clicked()), this, SLOT(chooseDestination())); (doc.qt.io/archives/qt-4.8/…) @Max Paperno @eyllanesc 不,应该可以。这个对我有用。也是used in the docs like that。 该信号有一个默认参数,既可以用作SIGNAL(clicked()),也可以用作SIGNAL(clicked(bool))。请参阅一般的 Signals & Slots 文档。【参考方案2】:

我也遇到了同样的现象。 我认为 clicked(bool) 和 clicked(bool = false) 是不同的。 信号有不同的事件。 我猜你的“myslot()”可能会触发第二个事件。

【讨论】:

以上是关于被 qt 4 信号和槽中的 clicked() 和 clicked(bool) 混淆的主要内容,如果未能解决你的问题,请参考以下文章

在 qt C++ 信号和槽中使用已删除函数错误

Qt 信号和槽

QT-自定义信号和槽

在Qt Creator 和在 vs2012 里添加信号和槽

qt中connect啥意思

QThread 中的 Qt 信号和槽