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

来源:互联网 发布:淘宝以前订单不见了 编辑:程序博客网 时间:2024/04/29 13:49

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
原创粉丝点击