Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Qt] Automatyczne zamykanie okienka

Ostatnio zmodyfikowano 2017-09-25 14:52
Autor Wiadomość
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:

C/C++
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(); //<---- wiem, że exec blokuje proces do zamknięcia, nie wiem jak to rozwiązać inaczej :(
}

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.
P-165102
baziorek
» 2017-09-22 11:49:23
Nie jestem specem od QT, ale może to zamknie okno:
http://doc.qt.io/qt-5​/qwindow.html#close
ewentualnie dla QDialog: http://doc.qt.io/qt-5​/qdialog.html#done
P-165104
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:
C/C++
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:

C/C++
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 :)
P-165107
baziorek
» 2017-09-22 13:48:01
Po uruchomieniu procesu, jeśli chcesz w pewnym momencie poczekać na wyniki z niego to musisz poczekać na zakończenie procesu, wydaje mi się, że dokonasz tego tą funkcją:
http://doc.qt.io/qt-5​/qprocess.html#waitForFinished

PS: Polecam użycie w connect nowej składni, dzięki temu pewne błędy zostaną wykryte podczas kompilacji
P-165108
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:

C/C++
if( logic == 1 )
{
    close();
}

ponieważ okno nawet się nie pojawi na "widoczność mrugnięcia" ;p
P-165109
Monika90
» 2017-09-22 14:28:58
A próbowałeś obsłużyć ten sygnał http://doc.qt.io/qt-5​/qprocess.html#finished
P-165111
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ę.
P-165112
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:
  • masz aplikację
  • uruchamiasz dodatkowe okno
  • aplikacja główna czeka na zakończenie dodatkowego okna
  • w dodatkowym oknie uruchamiasz proces i czekasz aż się on skończy
  • zamykasz okno
  • aplikacja ponownie zaczyna odpowiadać
?
Proponuję więc pewną zmianę na zasadzie:
  • masz aplikację
  • uruchamiasz w niej wątek, do którego przekazujesz obsługę nowo otwartego okna
  • główna aplikacja nadal odpowiada na eventy a wątek się bawi
  • po zakończeniu działania uruchomionego okna zamykasz je i kończysz wątek

jeśli się mylę to proszę o sprostowanie, ale chyba właśnie o takie działanie Ci chodzi, czyż nie?
P-165114
« 1 » 2
  Strona 1 z 2 Następna strona