2010-05-02 58 views
2

我想做一些当QMainWindow准备就绪时会访问网络的东西。
我想我不应该在构造函数中这样做,所以我试图找到一个小部件将得到的信号,并尝试在其他UI库中实现类似OnReady()的回调。但我仍然无法找到办法做到这一点。
非常感谢。有没有办法在Qt4中实现OnReady()回调?

回答

4

如果我理解正确,只要应用程序的事件循环准备好处理事件,就需要做一些事情。

你不能在构造函数中完成它的原因,因为应用程序的事件循环尚未准备好,直到之后构造函数完成运行。

你可以做的是在你的MainWindow类中创建一个包含你想要运行的代码的插槽,在构造函数中设置一个单次计时器,并让该计时器调用你的插槽。例如:

mainwindow.h

class MainWindow : public QMainWindow                           
{                                    
    Q_OBJECT                                 
public:                                  
    MainWindow(QWidget *parent = 0);                           
    ~MainWindow();                                
private slots: 
    void doStuff(); // This slot will contain your code 
// ... 
// ... 
// ... 
} 

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent)                          
    : QMainWindow(parent), ui(new Ui::MainWindow)                        
{                                    
    ui->setupUi(this); 
    QTimer::singleShot(0, this, SLOT(doStuff())); // This will call your slot when the event loop is ready 
    // ... 
    // ... 
    // ... 
} 

void MainWindow::doStuff() 
{ 
    // This code will run as soon as the event loop is ready 
} 
+0

非常感谢。我仍然想知道为什么Qt没有一个简单的方法来处理这个简单的任务... – jagttt 2010-05-02 12:03:29

+1

使用单次计时器更通用。它也可以用于其他时间,必须延迟操作直到当前事件处理完成。 – baysmith 2010-05-02 17:38:33

0

替代的方式是使用QMetaObject::invokeMethod与排队连接。如果你使用invokeMethod,你也可以传递一个参数。

QMetaObject::invokeMethod(
    this, 
    "onReady", 
    Qt::QueuedConnection, 
    Q_ARG(QString, argument)); 
相关问题