Anim Temat założony przez niniejszego użytkownika |
[Qt] Automatyczne zamykanie okienka » 2017-09-22 11:38:52 Cześć, Mam problem z zamykaniem okienek. Chodzi mi o to, że mam jedno główne okno aplikacji - na nim mam przycisk. Przycisk ten wywołuje akcję i otwiera się nowe okienko. Chciałbym, aby po zakończonej akcji okienko zamknęło się samoczynnie, a nie po wciśnięciu iksa ;p Moja aplikacja wygląda mniej więcej tak: SecWindow::SecWindow( QWidget * parent ) : QDialog( parent ) , ui( new Ui::SecWindow ) { Qlabel * label = new QLabel( this ); label->setGeometry( 220, 100, 70, 70 ); QMovie * movie = new QMovie( "/sciezka/.gif" ); label->setMovie( movie ); movie->start(); QProcess * proc = new QProcess(); proc->start( "sciezka/skrypt.sh" ); bool logic = proc->waitForFinished(); exec(); }
Powyższy kod to jest konstruktor okienka, który jest wywoływany w jednej z metod aplikacji. Niestety exec() blokuje proces. Natomiast ja chciałbym, aby po wykonaniu metody "proc->waitForFinished(), okienko zamknęło się automatycznie. Pomógłby mi ktoś? Zaznaczę tylko, że nie chodzi mi o zamknięcie po n sekundach, ale konkretnie po wykonaniu procesu. |
|
baziorek |
» 2017-09-22 11:49:23 |
|
Anim Temat założony przez niniejszego użytkownika |
» 2017-09-22 12:23:32 Dziekuję :) Faktycznie close() spełnia swoją rolę... ale w moim przypadku z tego co się orientuję powinienem w jakiś sposób powiązać wykonanie procesu oraz działanie okienka. Mam teraz coś takiego Wywołuję okienko: button = new QPushButton( tr( "Button" ), this ); button->setGeometry( 10, 55, 200, 30 ); connect( button, SIGNAL( clicked() ), this, SLOT( actual() ) );
Następnie po naciśnięciu przycisku pojawia się nowe okienko oraz wykonuje się proces: SecWindow::SecWindow( QWidget * parent ) : QDialog( parent ) , ui( new Ui::SecWindow ) { ui->setupUi( this ); resize( 500, 250 ); showLabel(); label = new QLabel( this ); label->setGeometry( 220, 100, 70, 70 ); QMovie * movie = new QMovie( "sciezka/gif" ); label->setMovie( movie ); movie->start(); label->show(); }
void MainWindow::actual() { QString name = "Pobieranie"; SecWindow * secWindow = new SecWindow; secWindow->setModal( true ); secWindow->setWindowTitle( name ); secWindow->show(); QProcess * proc = new QProcess(); proc->start( "sciezka/plik.sh" ); secWindow->close(); }
Niestety to rozwiązanie powoduje, że zarówno proces jak i wyświetlanie/zamykanie okna działa "obok siebie". Jak połączyć te dwie metody? Próbowałem jakoś poprzez łączenie sygnałów metodą connect. Ale mi nie poszło. Będę wdzięczny za wszelkie pomocne rady :) |
|
baziorek |
» 2017-09-22 13:48:01 |
|
Anim Temat założony przez niniejszego użytkownika |
» 2017-09-22 13:58:51 Problem z wykorzystaniem waitForFinish jest taki, że on blokuje wszelkie procesy w głównej aplikacji (w moim przypadku powoduje, że okno się nie wyświetla dopóty, dopóki nie zakończy się kopiowanie plików). Poza tym, nie do końca rozumiem, jak mam przechwycić informację, że proces się skończył ;/ Wprawdzie WaitForFinish zwraca wartość bool, ale w związku z tym, że blokuje wszelkie akcje (tak mi się przynajmniej wydaje), to nie mogę zrobić czegoś na zasadzie, że: if( logic == 1 ) { close(); }
ponieważ okno nawet się nie pojawi na "widoczność mrugnięcia" ;p |
|
Monika90 |
» 2017-09-22 14:28:58 |
|
Anim Temat założony przez niniejszego użytkownika |
» 2017-09-22 14:39:32 Widziałem to już wcześniej, ale kompletnie nie rozumiem jak działa ta funkcja ;/ zarówno dokumentacja jak i przykłady znalezione w Internecie mnie nie przybliżają do zrozumienia jak wykorzystać tę metodę.
|
|
baziorek |
» 2017-09-22 15:48:01 W kwestii wątków w QT niestety nie mam dużej wiedzy, ale patrząc na Twój kod, czy mam rację, że jest on zaprojektowany w taki sposób: ? Proponuję więc pewną zmianę na zasadzie: jeśli się mylę to proszę o sprostowanie, ale chyba właśnie o takie działanie Ci chodzi, czyż nie? |
|
« 1 » 2 |