Есть ли способ реализовать обратный вызов OnReady () в Qt4? - PullRequest
2 голосов
/ 02 мая 2010

Я хочу сделать что-то, что получит доступ к сети, когда QMainWindow будет готов.
Я полагаю, мне не следует делать это в конструкторе, поэтому я пытаюсь найти сигнал, который получит виджет, и пытаюсь реализовать что-то вроде обратного вызова OnReady () в другой библиотеке пользовательского интерфейса. Но я до сих пор не могу найти способ сделать это.
Заранее большое спасибо.

Ответы [ 2 ]

4 голосов
/ 02 мая 2010

Если я правильно понимаю, вам нужно что-то сделать, как только цикл обработки событий приложения будет готов к обработке событий.

Причина, по которой вы не можете сделать это в конструкторе, потому что цикл событий приложения не готов до некоторого времени после , когда конструктор завершил работу.

Что вы можете сделать, это создать слот в вашем классе 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 голосов
/ 04 мая 2010

Альтернативный способ - использовать QMetaObject::invokeMethod с подключением в очереди. Если вы используете invokeMethod, вы также можете передать аргумент.

QMetaObject::invokeMethod(
    this, 
    "onReady", 
    Qt::QueuedConnection, 
    Q_ARG(QString, argument));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...