2009-08-17 5 views
5

Was ist der beste Weg, um eine Play/Pause-Taste in Qt zu erstellen? Soll ich eine Aktion erstellen und das Symbol ändern, wenn ich darauf klicke, oder sollte ich zwei Aktionen erstellen und diese dann beim Klicken irgendwie ausblenden? Wie verwende ich eine Tastenkombination, um beide Aktionen zu aktivieren? (Pause beim Abspielen oder Wiedergabe im Pause-Modus).Qt Wiedergabe/Pause Aktion?

Antwort

6

Halten Sie es einfach. Verwenden Sie die gleiche Schaltfläche, aber wenn Sie mit dem Klicken arbeiten, ändern Sie das Symbol und wählen Sie die Verarbeitungslogik (Wiedergabe oder Pause) basierend auf dem aktuellen Status aus (Pause bei der Wiedergabe oder Wiedergabe bei Pausierung).

Um den Code klar zu halten, implementieren Sie zwei separate Methoden, eine für Play und eine für Pause und rufen Sie sie aus dem Steckplatz der Schaltfläche, abhängig vom Status.

+0

Ich müsste eigentlich das Symbol, den Text, den Statustipp, den Slot ändern, und anstatt die play() oder pause() Slots direkt aufzurufen, müsste ich eine Funktion in derselben Klasse aufrufen Aktualisieren Sie die Schaltfläche, und propagieren Sie dann die Aktion ... macht mehr Sinn, zwei Aktionen zu haben, die Sie wechseln können, damit Sie nicht alle diese Eigenschaften ändern müssen. – mpen

+0

Für mich sieht es einfacher aus, einen bedingten Anruf in einer Single-Slot-Methode zu haben, als einen Slot zu trennen und erneut zu verbinden ... Aber vielleicht ist es eine Frage der Präferenz :) –

+0

Nun, Sie müssten nicht disc/reconnect hatte zwei getrennte Aktionen, nicht? Ich wusste nicht, dass du einen Platz für beide Aktionen hast, aber das könnte besser funktionieren. Daran muss man mehr denken. – mpen

2

Ich denke, so etwas wie dies am einfachsten/am besten geeignet:

playAct = new QAction(QIcon(":/icons/elementary/media-playback-start.png"), tr("&Run"), controlActGroup); 
playAct->setShortcut(Qt::Key_Space); 
playAct->setCheckable(true); 
playAct->setStatusTip(tr("Run physics")); 
connect(playAct, SIGNAL(triggered()), editorView, SLOT(runPhysics())); 

pauseAct = new QAction(QIcon(":/icons/elementary/media-playback-pause.png"), tr("&Pause"), controlActGroup); 
pauseAct->setShortcut(Qt::Key_Space); 
pauseAct->setCheckable(true); 
pauseAct->setStatusTip(tr("Pause physics")); 
connect(pauseAct, SIGNAL(triggered()), editorView, SLOT(pausePhysics())); 

connect(playAct, SIGNAL(toggled(bool)), pauseAct, SLOT(setVisible(bool))); 
connect(pauseAct, SIGNAL(toggled(bool)), playAct, SLOT(setVisible(bool))); 
pauseAct->setChecked(true); 
pauseAct->setVisible(false); 

Das einzige, was Ich mag nicht wissen, ist, dass die Aktionen der anderen Taste Sichtbarkeit Status steuern. Da es keine setInvisible Funktion gibt, konnte ich sie nicht anschließen, so dass sie sich beim Anklicken verstecken konnten.

Das, und es scheint eine visuelle Lücke zu schaffen, wo der versteckte Knopf war (zumindest auf Ubuntu).

1

Sie können der Symbolleiste und dem Menü des Hauptfensters sowohl die Wiedergabe als auch die Pause hinzufügen und die Pause-Aktion unsichtbar machen. Wenn Sie diese Aktionen ändern müssen, müssen Sie nur die Sichtbarkeit der Aktionen ändern und es wirkt sich gleichzeitig auf das Menü und auf die Symbolleiste aus. Es ist praktisch, Code ist kompakt.

1

Ich bin mir nicht sicher, was Ihre Play/Pause-Tasten tun, aber ich baue eine App mit Phonon, um Audio zu streamen und ich konnte keinen guten Weg finden, den aktuellen Zustand des Medienobjekts zu erhalten.

Das nächste, was ich bekommen konnte, ist einen Steckplatz zu erstellen und es mit dem stateChanged() Signal zu verbinden, das MediaObject ausstrahlt. Ich landete dies zu tun:

MyMediaPlayer::MyMediaPlayer(QWidget *parent) : 
     QMainWindow(parent), 
     ui(new Ui::MyMediaPlayer) 
    { 
     ... 

     connect(mediaObj, SIGNAL(stateChanged(Phonon::State,Phonon::State)), 
       this, SLOT(handleMediaState(Phonon::State,Phonon::State))); 
    } 

... 

void MyMediaPlayer::handleMediaState(Phonon::State state, Phonon::State) 
{ 
    switch (state) 
    { 
    case Phonon::PlayingState: 
    case Phonon::LoadingState: 
    case Phonon::BufferingState: 
     //If we're playing, the button should pause 
     ui->playPauseButton->setIcon(QIcon(":/assets/stock_media-pause.svg")); 
     connect(ui->playPauseButton, SIGNAL(clicked()), 
       mediaObj, SLOT(pause())); 
     break; 
    case Phonon::PausedState: 
    case Phonon::StoppedState: 
     //if we're paused, the button should play 
     ui->playPauseButton->setIcon(QIcon(":/assets/stock_media-play.svg")); 
     connect(ui->playPauseButton, SIGNAL(clicked()), 
       mediaObj, SLOT(play())); 
    case Phonon::ErrorState: 
     //additionally, if there's an error, do error handling. 
     break; 
    default: 
     break; 
    } 
} 

Ich bin kein Fan von Verbindungs- und Wieder anschließen, aber ich denke, das ist der Qt Weg ist, es zu tun.