LINUX.ORG.RU

QDialog перед QMainWindow


0

1

У меня такой вопрос. У меня апликация, в которой главное окно-класс MainWindow.В конструкторе есть инициализация библиотек.Мне надо запустить окно типа QDialog,которое показывает процесс инициализации.Я запускаю его в отдельном потоке-с этим проблеммы нет и запускаю это в конструкторе MainWindow.Но когда инициализация заканчивается,нужно вернутся к главному окну,a этого почему-то не происходит.Кто-то пожет подсказать почему?

Заранее спасибо.


Неверно.
Все куда проще. В конструкторе ничего делать не надо(такого плана).
Просто со старта мейнвиндов должен быть скрыт, а в методе инициализации необходимо показать новый кудиалог (ну и процесс загрузки пользовательских данных в нем). Когда «загрузка закончена» кудиалог убиваешь, мейнвиндов.шоу

Jetty ★★★★★
()
Ответ на: комментарий от shty

Я думаю QSplashScreen мне поможет в другой раз,т.к. код уже готов.Переписывать его нет времени.

Сделал,как было предложено:

1.Конструктор MainWindow определяет только связи сигналов и их обработчиков.

2.Метод Initialise запускает QDialog в отдельном потоке и в нём инициализацию элементов.

3.Когда всё заканчивается-запускается сигнал,что всё закончилось.И ловит его MainWindow.Когда ловит-запускает метод show(),предварительно сделав delete на QDialog инициализации.

Вроде всё ОК. Но MainWindow всё ещё не появляется.

Когда же я инициализирую все элементы последовательно в конструкторе MainWindow и потом в ручную запускаю show(),то всё беГит,как родное.

Идеи,где я лажаю?

rapa
() автор топика
Ответ на: комментарий от rapa

1. делай не delete, а вызывай deleteLater() на диалоге
2. MainWindow::show() делаешь?
3. покажи код, так фиг понятно :)

shty ★★★★★
()
Ответ на: комментарий от shty

Вот и код:

MainWindow.cpp

MainWindow::MainWindow() {m_InitDlg = new InitialiseDlg();}

void MainWindow::Initialise() {m_InitDlg->RunInitSensor();}

void MainWindow::OnSignalInitialiseSuccess() { Run();}

void MainWindow::Run()

{

m_InitDlg->close();

m_InitDlg->deleteLater();

m_ProcessThread.start(QThread::TimeCriticalPriority);

m_CommThread.start(QThread::LowPriority);

m_TimeThread.start(QThread::LowestPriority);

m_EPBThread.start(QThread::LowPriority);

show();

}

Main.cpp:

int main(){

...

QApplication a(argc, argv);

MainWindow w;

w.close(); w.Initialise();

return a.exec();

}

rapa
() автор топика

> Мне надо запустить окно типа QDialog,которое показывает процесс инициализации.Я запускаю его в отдельном потоке-с этим проблеммы нет

с этим проблеммы нет

потрясающий оптимизм

мало того, что нет никакого смысла запускать QDialog в отдельном потоке, так еще и в документации написано «In GUI applications, the main thread is also called the GUI thread because it's the only thread that is allowed to perform GUI-related operations»

dt1 ★★
()
Ответ на: комментарий от Jetty

>К вышеотписавшемуся добавлю что правильно не Initialise а Initialize

Возле меня(в полметре) сидит шотландец.На это замечание он сказал: «Fucking yanks».

Initialise-английское(правильное) произношение,Initialize-американское(не правильное) произношение.

rapa
() автор топика
Ответ на: комментарий от rapa

Я тебе больше скажу, шотланцы не особо отличились в сфере разработки в ИТ. Т.о. предпочтение на стороне факинг янки, т.к. именно они/у них создавали(сь) языки программирования и большинство технологий, методик, принципов, правил и стандартов. Напомнило про лифт и 11

Jetty ★★★★★
()
Ответ на: комментарий от Jetty

1.Это был мой ответ на замечание на тему анлийского(там же было отмечено-По фиг).

2.Не надо обобщать.

3.Это бесполезная полемика

4.Я никого не предпочитаю,но в сфере английского,думаю-он прав

rapa
() автор топика
Ответ на: комментарий от rapa

В сфере английского конечно же он прав. В сфере программирования нет. Кстати я подозреваю что не янки виноваты, а скорее немцы :-) Но это так...

Jetty ★★★★★
()
Ответ на: комментарий от Jetty

>В сфере программирования нет

Как я уже говорил,но это бесполезная полемика,но всё-таки почему?

Ты же его не знаешь.Откуда такая категоричность.А немцы,пожалуй,да :)

rapa
() автор топика
Ответ на: комментарий от rapa

А зачем мне его знать? :-)
Кода много перевидал, вот и делаю выводы. Как правило обычно используют слово «Init», но в тех местах, где длинно - Initialize. Понятия не имею почему именно так.
А твой товарищ(исходя из фразы) янко-фоб, что подтверждает существующий стереотип о том, что шотландцы относятся к американскому английскому как непонятному недоразумения... Впрочем шотландский английский тоже недоразумение по меркам английского-английского :=)

Jetty ★★★★★
()

Нельзя юзать гуй вне главного потока - закон Qt.

Pavval ★★★★★
()
Ответ на: комментарий от rapa

не, ты потом вызвал

w.setHidden(false);
w.show();

?

короче, покажь код, который не пашет :)

shty ★★★★★
()
Ответ на: комментарий от shty

Попытался запустить следующий код на 2 платформах.Тестовая(комп х86) и целевая(ARM-встроенная система).

   int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.aboutQt();
    QSplashScreen *splash = new QSplashScreen;
    splash->setPixmap(QPixmap("./Logo.png"));
    splash->show();
    //splash->setGeometry(new QRect(
    Qt::Alignment topRight = Qt::AlignRight | Qt::AlignTop;
    splash->showMessage(QObject::tr("000"),topRight, Qt::white);
    sleep(3);
    splash->showMessage(QObject::tr("ABC"),topRight, Qt::white);
    sleep(3);
    splash->showMessage(QObject::tr("DEF"),topRight, Qt::white);
    sleep(3);
    MainWindow w;
    w.show();
    splash->finish(&w);
    return a.exec();
}


На тестовой платформе QSpalshScreen есть,на целевой-нет.Идеи?

rapa
() автор топика
Ответ на: комментарий от rapa

> sleep(3);

Fuck me! Ты ведь понимаешь, что до a.exec() никаких Qt событий не происходит, в том числе и по отрисовке всякого говна?

В доках есть же примеры, где явно указано использовать app.processEvents(), и даже поясняется зачем и почему.

anonymous
()
Ответ на: комментарий от anonymous

То,что мне важно сейчас-это QSplashScreen.

На тему app.processEvents()-объясняется,что это нужно для принятия событий от клавы и мыши.В конечном варианте,этот код должен бежать на платформе ARM(встроенной системе).Там,кроме сенсорного экрана,ничего внешнего нет.Поэтому я это и опустил.

rapa
() автор топика
Ответ на: комментарий от rapa

Приношу свои извинения, showMessage действительно явно вызывает repaint в обход event loop'а, но в таком случае я не вижу каких-то проблем с кодом.
Вполне возможно, что это баг Qt.

anonymous
()
Ответ на: комментарий от anonymous

На компе находит. Logo.png должен находится в директории,где находится бинарник.Он там и находится.

rapa
() автор топика
Ответ на: комментарий от anonymous

Нет.Не находит.Сначала,я прогонял апликацию по нфс и Logo.png находился в нужной директории,потом перенёс и то и то на платформу-всё ещё не находит.

rapa
() автор топика
Ответ на: комментарий от anonymous

Он уже в ресурсе.И парралелно я перенёс Logo.png в директорию с апликацией,т.к. в ресурсе не работало.

rapa
() автор топика
Ответ на: комментарий от rapa

Проблемма решена.В итоге оказалось,что я круто протупил.Ну как всегда и присходит,когда вроде бы всё нормально,но не работает. Испробовал 3 варианта:Диалог из конструктора MainWindow,Диалог перед вызовом конструктора MainWindow и SplashScreen,и все 3 не работали.Почему-то.Когда нашёл ошибку заработал сразу же первый вариант.Остальные не проверял.

Всем спасибо.

rapa
() автор топика
Ответ на: комментарий от rapa

В таких случаях принято рассказывать, что было не так.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.