Qt – Shotcut – 添加 Timeline 轨道

内容纲要

Shotcut 中用于编辑视频与音频的轨道为 TimelineDock 继承自 QDockWidget

当添加轨道时,会调用 TimelineDock 类成员函数 insertTrack()

void TimelineDock::insertTrack()
{
    if (m_selection.selectedTrack != -1)
        setSelection();

    // MAIN 为 MainWindow 的单例,此处定义了 InsertTrackCommand 类(继承自 QUndoCommand)
    MAIN.undoStack()->push(
        new Timeline::InsertTrackCommand(m_model, currentTrack()));
}

上述代码的主体部分其实是:

MAIN.undoStack()->push(new Timeline::InsertTrackCommand(m_model, currentTrack()));

Shotcut 在添加轨道时,会讲操作注册给 QT 的 撤销命令(QUndoCommand),而命令的主题部分,
在此撤销命令的 redo 函数中,也就是说,此类操作的执行方式都是调用 重做(redo) 函数去执行。
而此处调用 redo 函数则是由 Qt 中 QUndoStack 的 push 函数调用的,当我们 push 新函数时,
会自动调用 redo 函数,从而完成一次操作。

void AddTrackCommand::redo()
{
    LOG_DEBUG() << (m_isVideo ? "video" : "audio");
    if (m_isVideo)
        m_trackIndex = m_model.addVideoTrack();
    else
        m_trackIndex = m_model.addAudioTrack();
}

void AddTrackCommand::undo()
{
    LOG_DEBUG() << (m_isVideo ? "video" : "audio");
    m_model.removeTrack(m_trackIndex);
}

接下来重做命令会调用到 MultitrackModel 的函数中,在 TimeLineDock push 命令时,

传入的参数,MultitrackModel 继承自抽象的模型视图,用于显示轨道

Related Posts

发表回复

同步Schの秘密防空洞