内容纲要
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);
}