2

我需要从 C++ 代码模拟按钮单击。到目前为止,我已经编写了以下代码

/*
 * signalhandler.hpp
 *
 *  Created on: Nov 14, 2013
 *      Author: fnazeem
 */

#ifndef SIGNALHANDLER_HPP_
#define SIGNALHANDLER_HPP_

#include <QObject>



namespace bb
{
    namespace cascades
    {
        class Button;
    }
}

class signalhandler : public QObject
{
    Q_OBJECT

public:
    signalhandler();

public slots:
    void onClicked(bb::cascades::Button *button);



};


#endif /* SIGNALHANDLER_HPP_ */

到目前为止,在 signalhandler.cpp 中,这就是我所写的。假设我有一个特定按钮的地址,并且我想为那个按钮发出一个“点击”信号,而不是手动点击它。

/*
 * signalhandler.cpp
 *
 *  Created on: Nov 14, 2013
 *      Author: fnazeem
 */


#include "signalhandler.hpp"
#include <bb/cascades/Button>



void signalhandler::onClicked(bb::cascades::Button *button){



    emit button->clicked();

}

当我构建项目时,出现错误emit button->clicked();

这是错误

C:/bbndk/target_10_1_0_1020/qnx6/usr/include/bb/cascades/controls/abstractbutton.h:60:14: 错误:'void bb::cascades::AbstractButton::clicked()' 受保护

它说 clicked 是一种受保护的方法。是否有任何解决方法可以解决此问题并实现我的目标?

4

3 回答 3

4

您不能(不应该)简单地从目标类(发送者)外部发出信号,除非该类被设计为允许它。

你应该做的是强制类自己发出信号。如果您设计了类(这里不是这种情况),您通常会添加一个简单地发出信号的函数,例如emitClicked() { emit clicked(); }.

一些类已经具有这样的功能。但如果他们不这样做,你需要另一个技巧:

如果您正在处理QWidgets,您可以生成用户输入事件,这些事件的处理就像用户真正点击了特定的屏幕坐标一样;考虑到通常也会考虑的所有条件和状态(不一定会导致发出信号)。这可以通过调用qApp->notify(widget, event)whereevent是指向在此调用之前初始化的 QEvent 实例的指针来完成,例如:QMouseEvent event(QEvent::User, pos, Qt::LeftButton, button, stateKey);

我看到您正在使用BlackBerry Cascades系统。它不是基于 QWidgets,但它们也使用 QObject 事件系统以类似的方式处理事件。所以你应该能够应用上面的方法。

于 2013-11-14T09:10:09.003 回答
0

改变

emit button->clicked();

emit button->click();
于 2014-07-31T16:20:56.480 回答
0
void QAbstractButton::click () [slot]

应该为你做这项工作。它将发出clicked()信号以及与按钮的单击行为相结合的所有功能

也许由于这个事实,没有必要创建signalhandler类。

干杯

于 2013-11-14T09:06:10.870 回答