Это может быть немного устаревшим, но поскольку никто другой не ответил на него, кроме одного: Поскольку нет сигнала «Показать», я предлагаю переопределить событие показа следующим образом:
В вашем файле mainwindow.cpp:
void MainWindow::show()
{
QMainWindow::show();
QApplication::processEvents();
emit windowShown();
}
В вашем файле mainwindow.h где-то в объявлении MainWindow:
...
class MainWindow: public QMainWindow
{
...
signals:
void windowShown();
...
}
...
Затем, когда вы перейдете в дизайнер, щелкните правой кнопкой мыши в главном окне (самая верхняя часть дерева объектов) и выберите «Изменить сигналы/слоты». В кадре «Сигналы» нажмите кнопку «+», и вам нужно будет добавить «windowShown()», а затем нажать клавишу ввода, а затем кнопку «ОК» (обратите внимание, что многоточие «...» обозначает другой код, который уже в шапке).
Вот и все - теперь вы можете использовать редактор сигналов/слотов, чтобы связать слоты с сигналом 'windowShown', когда захотите. Теперь, если вы хотите что-то более похожее на событие Microsoft "Loaded", которое, как я думаю, используется в .NET, вам нужно будет создать некоторую переменную экземпляра и пометить ее, чтобы каждый раз, когда отображается окно, оно не испускалось, например:
void MainWindow::show()
{
QMainWindow::show();
QApplication::processEvents();
emit windowShown();
if (firstTimeShown == true)
{
emit windowLoaded();
firstTimeShown = false;
}
}
Кроме того, не забудьте инициализировать переменную значением «true» в вашем конструкторе:
MainWindow::MainWindow(QObject* parent)
...
{
firstTimeShown = true; // put this somewhere before ui->setupUi()
}
Однако, если вы решите поместить его в список инициализаторов, убедитесь, что он находится в правильном порядке. Компилятор будет жаловаться, если переменные не создаются сверху вниз, как объявлено в заголовке класса.
Теперь убедитесь, что когда вы определяете firstTimeShown в своем заголовке, вы делаете его приватным. И давайте не будем забывать о добавленных сигналах:
class MainWindow : public QMainWindow
{
...
signals:
void windowLoaded();
void windowShown();
private:
bool firstTimeShown;
...
Вот об этом. Благодаря гибкости сигналов и слотов довольно легко имитировать любое событие, которое вы можете найти в формах Windows или в MFC. Это просто требует немного усилий со стороны программиста. Как только вы освоитесь, это станет второй натурой.
примечание: вероятно, существуют существуют оптимизации или лучшие и более точные способы заставить работать сигналы "Loaded" и "Shown", но я оставил такие вещи для простоты. И чтобы вернуться к заданному вопросу, вызов QApplication::processEvents(), скорее всего, то, что вы хотите сделать вместо ожидания фиксированного времени, потому что кто знает, сколько времени это займет, если пользователь запускает 100 других вещей на вдобавок к этому и т. д. и т. д. Надеюсь, что это помогло, дополнительное объяснение было включено в надежде, что оно может дать вам лучший способ делать то, что вы хотите сделать, вместо того, чтобы ждать, пока что-то будет сделано, «зная», что это сделано является гораздо лучшей альтернативой.
22.12.2013