有没有办法在Qt4中实现OnReady()回调?

时间:2010-05-02 08:48:05

标签: c++ qt qt4

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

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

替代方法是将QMetaObject::invokeMethod与排队连接一起使用。如果使用invokeMethod,也可以传递参数。

QMetaObject::invokeMethod(
    this, 
    "onReady", 
    Qt::QueuedConnection, 
    Q_ARG(QString, argument));