QMetaObject::invokeMethod()---------Qt 类外调用一个 private slots 函数

http://blog.csdn.net/zengcccc/article/details/7018230

MainWindow中 private slots 函数 void print_on_log(QString strtemp);输出一个字符串到编辑窗口中

class MainWindow:publicQMainWindow

{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
private slots:
    void print_on_log(QString strtemp);

 

定义一个新类Test_one在此类中调用上面的私有槽该类定义为

class Test_one

{
public:
    Test_one(QObject * fromMain)
    {
        this->fromMain=fromMain;
    }
    void run();
private:
    QObject * fromMain;
};
void Test_one::run()
{
    QString strTemp="类外调用print_on_log函数";
    QMetaObject::invokeMethod(fromMain,"print_on_log",Qt::QueuedConnection, Q_ARG(QString,strTemp));
 
}

接下来就是该如何触发这个类的run函数,当然可以放在任何地方来触发了,本示例为了方便,就在MainWindow调用.

void MainWindow::on_pushButton_clicked()

{
Test_one *test=new Test_one(this);
    test->run();
 
}

这样就实现了在类外调用private slots:函数了.

当然本例的调用方式有些变态.但是还是有在类外调用私有槽函数的可能.

还有一点需要注意:一些程序员认为使用了QMetaObject::invokeMethod()要比发送自定义事件好一些,因为它可以与Qt信号无缝对接,并且不需要创建创建自定义的QEvent子类或者是重新实现事件要发送到的窗口部件中的QWidget::event().实际上,线程之间的信号和槽是通过Qt的事件机制来实现的.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 `invokeMethod` 中,第二个参数指定的是函数名称,它是目标对象中的函数名称,而不是自身函数的名称。也就是说,`targetObject` 是目标对象,`myFunction` 是目标对象中的一个函数名称。 在这个例子中,`invokeMethod` 方法会将一个名为 `myFunction` 的函数调用请求发送到 `targetObject` 所在的线程的事件队列中,等待该线程处理该请求。当该请求被处理时,`targetObject` 对象就会执行 `myFunction` 函数,同时传入一个整数参数 42。 需要注意的是,目标对象中的函数必须是可访问的,否则无法调用。如果目标对象中的函数是私有的或受保护的,需要在目标对象中添加一个公共的槽函数,然后在该槽函数中调用私有或受保护的函数。例如: ```cpp class MyClass : public QObject { Q_OBJECT public slots: void mySlot() { // 调用私有函数 myPrivateFunction(); } private: void myPrivateFunction() { // 私有函数实现 } }; ``` 在这个例子中,`MyClass` 类中定义了一个私有函数 `myPrivateFunction`,并在 `MyClass` 类中添加了一个公共的槽函数 `mySlot`,该槽函数中调用了私有函数 `myPrivateFunction`。在使用 `invokeMethod` 时,可以调用 `mySlot` 函数来间接调用私有函数 `myPrivateFunction`,例如: ```cpp QMetaObject::invokeMethod(targetObject, "mySlot", Qt::QueuedConnection); ``` 这个例子中,`invokeMethod` 方法会将一个名为 `mySlot` 的函数调用请求发送到 `targetObject` 所在的线程的事件队列中,等待该线程处理该请求。当该请求被处理时,`targetObject` 对象就会执行 `mySlot` 函数,从而间接调用私有函数 `myPrivateFunction`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值