MainWindow中 private slots 函數 void print_on_log(QString strtemp);輸出一個字符串到編輯窗口中
class MainWindow:publicQMainWindow
{
Q_OBJECT
public:
explicitMainWindow(QWidget*parent=0);
~MainWindow();
privateslots:
voidprint_on_log(QStringstrtemp);
定義一個新類Test_one在此類中調用上面的私有槽該類定義為
class Test_one
{
public:
Test_one(QObject*fromMain)
{
this->fromMain=fromMain;
}
voidrun();
private:
QObject*fromMain;
};
voidTest_one::run()
{
QStringstrTemp="類外調用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=newTest_one(this);
test->run();
}
這樣就實現了在類外調用private slots:函數了.
當然本例的調用方式有些變態.但是還是有在類外調用私有槽函數的可能.
還有一點需要注意:一些程序員認為使用了QMetaObject::invokeMethod()要比發送自定義事件好一些,因為它可以與Qt信號無縫對接,並且不需要創建創建自定義的QEvent子類或者是重新實現事件要發送到的窗口部件中的QWidget::event().實際上,線程之間的信號和槽是通過Qt的事件機制來實現的.