代码之家  ›  专栏  ›  技术社区  ›  mpen

Qt播放/暂停动作?

  •  5
  • mpen  · 技术社区  · 16 年前

    在qt中创建播放/暂停按钮的最佳方法是什么?我应该创建一个操作并在单击时更改它的图标,还是应该创建两个操作,然后在单击时隐藏一个操作?如何使用一个快捷键来激活这两个操作?(播放时暂停,或暂停时播放)。

    4 回复  |  直到 13 年前
        1
  •  6
  •   Cătălin Pitiș    16 年前

    保持简单 . 使用相同的按钮,但处理单击时,更改图标并根据当前状态选择处理逻辑(播放或暂停)(播放时暂停或暂停时播放)。

    为了保持代码清晰,实现两种不同的方法,一种用于播放,另一种用于暂停,并从按钮的槽中调用这些方法,继续执行状态。

        2
  •  2
  •   mpen    16 年前

    我认为这样的事情最简单/最合适:

    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);
    

    我唯一不喜欢的是,这些操作控制着另一个按钮的可见性状态。因为没有 setInvisible 函数我无法连接它,以便单击时它们可以隐藏自己。

    这样,它似乎在隐藏按钮所在的位置(至少在Ubuntu上)创建了一个视觉间隙。

        3
  •  1
  •   trig-ger    13 年前

    可以将播放和暂停操作添加到工具栏和主窗口的菜单中,并使暂停操作不可见。当需要切换此操作时,只需更改操作的可见性,它会同时在菜单和工具栏上产生影响。很方便,代码很紧凑。

        4
  •  1
  •   Vishal Kotcherlakota    13 年前

    我不知道你的播放/暂停按钮在做什么,但我正在构建一个应用程序,用Phonon来传输音频,我找不到一个好方法来获取媒体对象的当前状态。

    我能得到的最接近的是创建一个插槽并将其连接到 stateChanged() 信号表明 MediaObject 发射。我最终做了这件事:

        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;
        }
    }
    

    我不喜欢连接和重新连接,但我想这是qt方法。