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