├── HTYVS ├── HTYVS.desktop ├── HTYVS.pro ├── README.md ├── add.png ├── clip.cpp ├── clip.h ├── clip.ui ├── cut.png ├── icon.jpg ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── mainwindow.ui ├── preview.png └── res.qrc /HTYVS: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonichy/HTYVideoSpliter/a96bedc7f590b7f54a7f5d333e111ca64ceb43f0/HTYVS -------------------------------------------------------------------------------- /HTYVS.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=HTYVS 3 | Comment= 4 | Exec=/media/sonichy/job/HY/Linux/Qt/HTYVS/HTYVS 5 | Icon=/media/sonichy/job/HY/Linux/Qt/HTYVS/icon.jpg 6 | Path=/media/sonichy/job/HY/Linux/Qt/HTYVS 7 | Terminal=false 8 | Type=Application 9 | MimeType= 10 | Categories= -------------------------------------------------------------------------------- /HTYVS.pro: -------------------------------------------------------------------------------- 1 | QT += core gui multimedia multimediawidgets 2 | 3 | greaterThan(QT_MAJOR_VERSION, 4): QT += widgets 4 | 5 | TARGET = HTYVS 6 | TEMPLATE = app 7 | 8 | SOURCES += \ 9 | main.cpp \ 10 | mainwindow.cpp \ 11 | clip.cpp 12 | 13 | HEADERS += \ 14 | mainwindow.h \ 15 | clip.h 16 | 17 | FORMS += \ 18 | mainwindow.ui \ 19 | clip.ui 20 | 21 | RESOURCES += \ 22 | res.qrc -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Qt 海天鹰视频分割器 2 | 基于 Qt 和 FFmpeg 的视频、音频分割软件。 3 | 已编译好的 HTYVS 程序适用 64 位 Linux 系统 Qt5 环境,双击运行,其他版本请自行编译。 4 | 5 | ![alt](preview.png) -------------------------------------------------------------------------------- /add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonichy/HTYVideoSpliter/a96bedc7f590b7f54a7f5d333e111ca64ceb43f0/add.png -------------------------------------------------------------------------------- /clip.cpp: -------------------------------------------------------------------------------- 1 | #include "clip.h" 2 | #include "ui_clip.h" 3 | #include 4 | #include 5 | 6 | Clip::Clip(QWidget *parent) : 7 | QWidget(parent), 8 | ui(new Ui::Clip) 9 | { 10 | ui->setupUi(this); 11 | connect(ui->timeEditStart, SIGNAL(timeChanged(QTime)), this, SLOT(timeChange())); 12 | connect(ui->timeEditEnd, SIGNAL(timeChanged(QTime)), this, SLOT(timeChange())); 13 | } 14 | 15 | Clip::~Clip() 16 | { 17 | delete ui; 18 | } 19 | 20 | void Clip::on_pushButtonCut_clicked() 21 | { 22 | QString cmd; 23 | QString filepath_clip = QFileInfo(filepath).absolutePath() + "/" + QFileInfo(filepath).baseName() + "_" + clipname + "." + QFileInfo(filepath).suffix(); 24 | cmd = "ffmpeg -i \"" + filepath + "\" -y -ss " + ui->timeEditStart->time().toString("hh:mm:ss") + " -to " + ui->timeEditEnd->time().toString("hh:mm:ss") + " -acodec copy -vcodec copy \"" + filepath_clip + "\""; 25 | if(ui->checkBox_intra->isChecked()){ 26 | QString filename_intra = QFileInfo(filepath).baseName() + "_intra." + QFileInfo(filepath).suffix(); 27 | QString filepath_intra = QFileInfo(filepath).absolutePath() + "/" + filename_intra; 28 | if(!QFileInfo(filepath_intra).exists()){ 29 | ui->pushButtonCut->setEnabled(false); 30 | ui->progressBar->setMaximum(0); 31 | cmd = "ffmpeg -i \"" + filepath + "\" -qscale 0 -intra " + filepath_intra; //由帧间编码转为帧内编码,解决剪辑的视频某时间段黑屏问题,体积会增大。 32 | QProcess *process = new QProcess; 33 | process->setObjectName("intra"); 34 | qDebug() << cmd; 35 | process->start(cmd); 36 | connect(process, SIGNAL(finished(int)), this, SLOT(processFinish(int))); 37 | connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(processOutput())); 38 | process->waitForFinished(); 39 | } 40 | cmd = "ffmpeg -i \"" + filepath_intra + "\" -y -ss " + ui->timeEditStart->time().toString("hh:mm:ss") + " -to " + ui->timeEditEnd->time().toString("hh:mm:ss") + " -acodec copy -vcodec copy \"" + filepath_clip + "\""; 41 | } 42 | QProcess *process = new QProcess; 43 | process->setObjectName("cut"); 44 | qDebug() << cmd; 45 | process->start(cmd); 46 | connect(process, SIGNAL(finished(int)), this, SLOT(processFinish(int))); 47 | connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(processOutput())); 48 | ui->progressBar->setMaximum(0); 49 | } 50 | 51 | void Clip::processFinish(int i) 52 | { 53 | qDebug() << "finish" << i; 54 | ui->progressBar->setMaximum(100); 55 | ui->progressBar->setValue(100); 56 | if (sender()->objectName() == "intra") ui->pushButtonCut->setEnabled(true); 57 | if (i==1) ui->progressBar->setFormat("剪辑失败"); 58 | } 59 | 60 | void Clip::processOutput() 61 | { 62 | qDebug() << process->readAllStandardOutput(); 63 | ui->progressBar->setToolTip(QString(process->readAllStandardOutput())); 64 | } 65 | 66 | void Clip::timeChange() 67 | { 68 | qint64 start = ui->timeEditStart->time().msecsSinceStartOfDay(); 69 | qint64 end = ui->timeEditEnd->time().msecsSinceStartOfDay(); 70 | QTime t(0,0,0); 71 | t = t.addMSecs(end-start); 72 | ui->timeEditDuration->setTime(t); 73 | emit areaChange(start, end); 74 | } -------------------------------------------------------------------------------- /clip.h: -------------------------------------------------------------------------------- 1 | #ifndef CLIP_H 2 | #define CLIP_H 3 | 4 | #include 5 | #include 6 | 7 | namespace Ui { 8 | class Clip; 9 | } 10 | 11 | class Clip : public QWidget 12 | { 13 | Q_OBJECT 14 | 15 | public: 16 | explicit Clip(QWidget *parent = 0); 17 | ~Clip(); 18 | Ui::Clip *ui; 19 | QString filepath, clipname; 20 | 21 | private: 22 | QProcess *process; 23 | 24 | private slots: 25 | void on_pushButtonCut_clicked(); 26 | void processFinish(int i); 27 | void processOutput(); 28 | void timeChange(); 29 | 30 | signals: 31 | void areaChange(int start, int end); 32 | 33 | }; 34 | 35 | #endif // CLIP_H 36 | -------------------------------------------------------------------------------- /clip.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Clip 4 | 5 | 6 | 7 | 0 8 | 0 9 | 600 10 | 32 11 | 12 | 13 | 14 | Form 15 | 16 | 17 | 18 | 5 19 | 20 | 21 | 5 22 | 23 | 24 | 0 25 | 26 | 27 | 5 28 | 29 | 30 | 0 31 | 32 | 33 | 34 | 35 | 开始 36 | 37 | 38 | 39 | 40 | 41 | 42 | true 43 | 44 | 45 | QDateTimeEdit::HourSection 46 | 47 | 48 | hh:mm:ss:zzz 49 | 50 | 51 | 52 | 53 | 54 | 55 | 结束 56 | 57 | 58 | 59 | 60 | 61 | 62 | QDateTimeEdit::HourSection 63 | 64 | 65 | hh:mm:ss:zzz 66 | 67 | 68 | 69 | 70 | 71 | 72 | 时长 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | true 83 | 84 | 85 | QAbstractSpinBox::NoButtons 86 | 87 | 88 | QDateTimeEdit::HourSection 89 | 90 | 91 | hh:mm:ss:zzz 92 | 93 | 94 | 95 | 96 | 97 | 98 | 解决视频黑屏问题,体积会增大。 99 | 100 | 101 | 帧内转码 102 | 103 | 104 | 105 | 106 | 107 | 108 | Qt::NoFocus 109 | 110 | 111 | 112 | 113 | 114 | 115 | :/cut.png:/cut.png 116 | 117 | 118 | 119 | 20 120 | 20 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 100 129 | 130 | 131 | 0 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | -------------------------------------------------------------------------------- /cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonichy/HTYVideoSpliter/a96bedc7f590b7f54a7f5d333e111ca64ceb43f0/cut.png -------------------------------------------------------------------------------- /icon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonichy/HTYVideoSpliter/a96bedc7f590b7f54a7f5d333e111ca64ceb43f0/icon.jpg -------------------------------------------------------------------------------- /main.cpp: -------------------------------------------------------------------------------- 1 | #include "mainwindow.h" 2 | #include 3 | 4 | int main(int argc, char *argv[]) 5 | { 6 | QApplication a(argc, argv); 7 | qSetMessagePattern("[ %{file}: %{line} ] %{message}"); 8 | MainWindow w; 9 | w.show(); 10 | return a.exec(); 11 | } -------------------------------------------------------------------------------- /mainwindow.cpp: -------------------------------------------------------------------------------- 1 | #include "mainwindow.h" 2 | #include "ui_mainwindow.h" 3 | #include "clip.h" 4 | #include "ui_clip.h" 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | MainWindow::MainWindow(QWidget *parent) : 15 | QMainWindow(parent), 16 | ui(new Ui::MainWindow) 17 | { 18 | filepath = "."; 19 | ui->setupUi(this); 20 | move((QApplication::desktop()->width() - width())/2, (QApplication::desktop()->height() - height())/2); 21 | 22 | video = new QVideoWidget; 23 | video->setStyleSheet("background:black;"); 24 | ui->layoutVideo->addWidget(video); 25 | video->setMouseTracking(true); 26 | video->show(); 27 | player = new QMediaPlayer; 28 | player->setVolume(100); 29 | player->setVideoOutput(video); 30 | connect(player, SIGNAL(durationChanged(qint64)), this, SLOT(durationChange(qint64))); 31 | connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(positionChange(qint64))); 32 | connect(player, SIGNAL(stateChanged(QMediaPlayer::State)), SLOT(stateChange(QMediaPlayer::State))); 33 | connect(ui->sliderProgress, SIGNAL(valueChanged(int)),this, SLOT(setSTime(int))); 34 | connect(ui->sliderProgress, SIGNAL(sliderReleased()),this, SLOT(setMPPosition())); 35 | connect(new QShortcut(QKeySequence(Qt::Key_Space), this), SIGNAL(activated()), this, SLOT(on_pushButtonPlay_clicked())); 36 | connect(new QShortcut(QKeySequence(Qt::Key_Left), this), SIGNAL(activated()), this, SLOT(seekBackward())); 37 | connect(new QShortcut(QKeySequence(Qt::Key_Right), this), SIGNAL(activated()), this, SLOT(seekForward())); 38 | connect(ui->listWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(playClip(QListWidgetItem*))); 39 | } 40 | 41 | MainWindow::~MainWindow() 42 | { 43 | delete ui; 44 | } 45 | 46 | void MainWindow::open(QString path) 47 | { 48 | filepath = path; 49 | player->setMedia(QUrl::fromLocalFile(path)); 50 | ui->statusBar->showMessage("打开 " + path); 51 | ui->sliderProgress->setStyleSheet(""); 52 | ui->listWidget->clear(); 53 | } 54 | 55 | void MainWindow::on_action_open_triggered() 56 | { 57 | //if(filepath == "") filepath = "."; 58 | filepath = QFileDialog::getOpenFileName(this, "打开媒体文件", filepath); 59 | if(!filepath.isEmpty()){ 60 | open(filepath); 61 | } 62 | } 63 | 64 | void MainWindow::on_action_about_triggered() 65 | { 66 | QMessageBox aboutMB(QMessageBox::NoIcon, "关于", "海天鹰视频分割器 1.0\n一款基于 Qt 和 FFmpeg 的视频分割器。\n作者:黄颖\nE-mail: sonichy@163.com\n主页:https://www.github.com/sonichy"); 67 | aboutMB.setIconPixmap(QPixmap(":/icon.jpg").scaled(150,150)); 68 | aboutMB.exec(); 69 | } 70 | 71 | void MainWindow::on_pushButtonPlay_clicked() 72 | { 73 | if(player->state() == QMediaPlayer::PlayingState){ 74 | player->pause(); 75 | }else{ 76 | player->play(); 77 | } 78 | } 79 | 80 | void MainWindow::on_pushButtonStart_clicked() 81 | { 82 | pStart = ui->sliderProgress->value(); 83 | areaChange(pStart, pEnd); 84 | if(ui->listWidget->currentRow() != -1){ 85 | Clip *clip = (Clip*)(ui->listWidget->itemWidget(ui->listWidget->item(ui->listWidget->currentRow()))); 86 | QTime t(0,0,0); 87 | t = t.addMSecs(pStart); 88 | clip->ui->timeEditStart->setTime(t); 89 | } 90 | } 91 | 92 | void MainWindow::on_pushButtonEnd_clicked() 93 | { 94 | pEnd = ui->sliderProgress->value(); 95 | areaChange(pStart, pEnd); 96 | if(ui->listWidget->currentRow() != -1){ 97 | Clip *clip = (Clip*)(ui->listWidget->itemWidget(ui->listWidget->item(ui->listWidget->currentRow()))); 98 | QTime t(0,0,0); 99 | t = t.addMSecs(pEnd); 100 | clip->ui->timeEditEnd->setTime(t); 101 | } 102 | } 103 | 104 | void MainWindow::areaChange(int start, int end) 105 | { 106 | float p1 = (float)start/ui->sliderProgress->maximum(); 107 | float p2 = (float)end/ui->sliderProgress->maximum(); 108 | ui->sliderProgress->setStyleSheet(QString("background-color: qlineargradient( spread:pad, x1:0, y1:0, x2:1, y2:0," 109 | "stop:0 #FFFFFF, stop:%1 #FFFFFF," 110 | "stop:%2 #0000FF, stop:%3 #0000FF," 111 | "stop:%4 #FFFFFF, stop:1 #FFFFFF );") 112 | .arg(p1-0.001) 113 | .arg(p1) 114 | .arg(p2-0.001) 115 | .arg(p2)); 116 | } 117 | 118 | void MainWindow::on_pushButtonAdd_clicked() 119 | { 120 | Clip *clip = new Clip; 121 | connect(clip, SIGNAL(areaChange(int,int)), this, SLOT(areaChange(int,int))); 122 | clip->filepath = filepath; 123 | QDateTime datetime = QDateTime::currentDateTime(); 124 | clip->clipname = "clip" + datetime.toString("yyyyMMddhhmmss"); 125 | QTime t(0,0,0); 126 | t = t.addMSecs(ui->sliderProgress->maximum()); 127 | clip->ui->timeEditStart->setMaximumTime(t); 128 | clip->ui->timeEditEnd->setMaximumTime(t); 129 | t.setHMS(0,0,0); 130 | t = t.addMSecs(pStart); 131 | clip->ui->timeEditStart->setTime(t); 132 | t.setHMS(0,0,0); 133 | t = t.addMSecs(pEnd); 134 | clip->ui->timeEditEnd->setTime(t); 135 | t.setHMS(0,0,0); 136 | t = t.addMSecs(pEnd - pStart); 137 | clip->ui->timeEditDuration->setTime(t); 138 | QListWidgetItem *LWI = new QListWidgetItem(ui->listWidget); 139 | LWI->setSizeHint(QSize(500,32)); 140 | ui->listWidget->addItem(LWI); 141 | ui->listWidget->setItemWidget(LWI,clip); 142 | } 143 | 144 | void MainWindow::on_pushButtonDelete_clicked() 145 | { 146 | if(ui->listWidget->currentRow() != -1){ 147 | ui->listWidget->takeItem(ui->listWidget->currentRow()); 148 | ui->listWidget->setCurrentRow(-1); 149 | } 150 | } 151 | 152 | void MainWindow::on_pushButtonDirectory_clicked() 153 | { 154 | if(filepath != ""){ 155 | QDesktopServices::openUrl(QUrl::fromLocalFile(QFileInfo(filepath).absolutePath())); 156 | } 157 | } 158 | 159 | void MainWindow::durationChange(qint64 d) 160 | { 161 | ui->sliderProgress->setMaximum(d); 162 | QTime t(0,0,0); 163 | t = t.addMSecs(d); 164 | QString sTimeTotal = t.toString("hh:mm:ss"); 165 | ui->labelTimeTotal->setText(sTimeTotal); 166 | pStart = 0; 167 | pEnd = d; 168 | } 169 | 170 | void MainWindow::positionChange(qint64 p) 171 | { 172 | ui->sliderProgress->setValue(p); 173 | //qDebug() << p << pEnd; 174 | //if (p > pEnd) player->pause(); // 崩溃 175 | } 176 | 177 | void MainWindow::setSTime(int v) 178 | { 179 | QTime t(0,0,0); 180 | t = t.addMSecs(v); 181 | QString sTimeElapse = t.toString("hh:mm:ss"); 182 | ui->labelTimeNow->setText(sTimeElapse); 183 | } 184 | 185 | void MainWindow::setMPPosition() 186 | { 187 | player->setPosition(ui->sliderProgress->value()); 188 | } 189 | 190 | void MainWindow::stateChange(QMediaPlayer::State state) 191 | { 192 | //qDebug() << state; 193 | if(state == QMediaPlayer::PlayingState){ 194 | ui->pushButtonPlay->setIcon(QIcon::fromTheme("media-playback-pause")); 195 | ui->pushButtonPlay->setToolTip("暂停 Space"); 196 | }else if(state == QMediaPlayer::PausedState){ 197 | ui->pushButtonPlay->setIcon(QIcon::fromTheme("media-playback-start")); 198 | ui->pushButtonPlay->setToolTip("播放 Space"); 199 | }else if(state == QMediaPlayer::StoppedState){ 200 | ui->pushButtonPlay->setIcon(QIcon::fromTheme("media-playback-start")); 201 | ui->pushButtonPlay->setToolTip("播放 Space"); 202 | } 203 | } 204 | 205 | void MainWindow::playClip(QListWidgetItem* item) 206 | { 207 | Clip *clip = (Clip*)(ui->listWidget->itemWidget(item)); 208 | pStart = clip->ui->timeEditStart->time().msecsSinceStartOfDay(); 209 | pEnd = clip->ui->timeEditEnd->time().msecsSinceStartOfDay(); 210 | player->setPosition(pStart); 211 | player->play(); 212 | } 213 | 214 | void MainWindow::seekBackward() 215 | { 216 | player->setPosition(player->position() - 5000); 217 | } 218 | 219 | void MainWindow::seekForward() 220 | { 221 | player->setPosition(player->position() + 5000); 222 | } 223 | 224 | void MainWindow::dragEnterEvent(QDragEnterEvent *e) 225 | { 226 | //if(e->mimeData()->hasFormat("text/uri-list")) //只能打开文本文件 227 | e->acceptProposedAction(); //可以在这个窗口部件上拖放对象 228 | } 229 | 230 | void MainWindow::dropEvent(QDropEvent *e) //释放对方时,执行的操作 231 | { 232 | QList urls = e->mimeData()->urls(); 233 | if(urls.isEmpty()) 234 | return ; 235 | 236 | QString fileName = urls.first().toLocalFile(); 237 | 238 | // foreach (QUrl u, urls) { 239 | // qDebug() << u.toString(); 240 | // } 241 | // qDebug() << urls.size(); 242 | 243 | if(fileName.isEmpty()) 244 | return; 245 | 246 | open(fileName); 247 | } -------------------------------------------------------------------------------- /mainwindow.h: -------------------------------------------------------------------------------- 1 | #ifndef MAINWINDOW_H 2 | #define MAINWINDOW_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | namespace Ui { 10 | class MainWindow; 11 | } 12 | 13 | class MainWindow : public QMainWindow 14 | { 15 | Q_OBJECT 16 | 17 | public: 18 | explicit MainWindow(QWidget *parent = 0); 19 | ~MainWindow(); 20 | 21 | protected: 22 | void dragEnterEvent(QDragEnterEvent*); 23 | void dropEvent(QDropEvent*); 24 | 25 | private: 26 | Ui::MainWindow *ui; 27 | QMediaPlayer *player; 28 | QVideoWidget *video; 29 | QString filepath, intraPath; 30 | qint64 pStart, pEnd; 31 | void open(QString path); 32 | 33 | private slots: 34 | void on_action_open_triggered(); 35 | void on_action_about_triggered(); 36 | void on_pushButtonPlay_clicked(); 37 | void on_pushButtonStart_clicked(); 38 | void on_pushButtonEnd_clicked(); 39 | void on_pushButtonAdd_clicked(); 40 | void on_pushButtonDelete_clicked(); 41 | void on_pushButtonDirectory_clicked(); 42 | void durationChange(qint64); 43 | void positionChange(qint64); 44 | void setSTime(int v); 45 | void setMPPosition(); 46 | void stateChange(QMediaPlayer::State state); 47 | void playClip(QListWidgetItem *item); 48 | void seekBackward(); 49 | void seekForward(); 50 | void areaChange(int start, int end); 51 | 52 | }; 53 | 54 | #endif // MAINWINDOW_H -------------------------------------------------------------------------------- /mainwindow.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | MainWindow 4 | 5 | 6 | 7 | 0 8 | 0 9 | 800 10 | 600 11 | 12 | 13 | 14 | true 15 | 16 | 17 | 海天鹰视频分割器 18 | 19 | 20 | 21 | :/icon.jpg:/icon.jpg 22 | 23 | 24 | 25 | 26 | 0 27 | 28 | 29 | 5 30 | 31 | 32 | 0 33 | 34 | 35 | 5 36 | 37 | 38 | 0 39 | 40 | 41 | 42 | 43 | 5 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | Qt::NoFocus 52 | 53 | 54 | Qt::Horizontal 55 | 56 | 57 | 58 | 59 | 60 | 61 | 5 62 | 63 | 64 | 4 65 | 66 | 67 | 68 | 69 | Qt::NoFocus 70 | 71 | 72 | 播放 Space 73 | 74 | 75 | 76 | 77 | 78 | 79 | .. 80 | 81 | 82 | 83 | 24 84 | 24 85 | 86 | 87 | 88 | true 89 | 90 | 91 | 92 | 93 | 94 | 95 | Qt::Horizontal 96 | 97 | 98 | 99 | 40 100 | 20 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | Qt::NoFocus 109 | 110 | 111 | 起点 112 | 113 | 114 | 115 | 116 | 117 | 118 | .. 119 | 120 | 121 | 122 | 24 123 | 24 124 | 125 | 126 | 127 | true 128 | 129 | 130 | 131 | 132 | 133 | 134 | Qt::NoFocus 135 | 136 | 137 | 终点 138 | 139 | 140 | 141 | 142 | 143 | 144 | .. 145 | 146 | 147 | 148 | 24 149 | 24 150 | 151 | 152 | 153 | true 154 | 155 | 156 | 157 | 158 | 159 | 160 | Qt::NoFocus 161 | 162 | 163 | 添加 164 | 165 | 166 | 167 | 168 | 169 | 170 | .. 171 | 172 | 173 | 174 | 22 175 | 22 176 | 177 | 178 | 179 | true 180 | 181 | 182 | 183 | 184 | 185 | 186 | Qt::NoFocus 187 | 188 | 189 | 删除 190 | 191 | 192 | 193 | 194 | 195 | 196 | .. 197 | 198 | 199 | 200 | 20 201 | 20 202 | 203 | 204 | 205 | true 206 | 207 | 208 | 209 | 210 | 211 | 212 | Qt::NoFocus 213 | 214 | 215 | 打开 216 | 217 | 218 | 219 | 220 | 221 | 222 | .. 223 | 224 | 225 | 226 | 20 227 | 20 228 | 229 | 230 | 231 | true 232 | 233 | 234 | 235 | 236 | 237 | 238 | 当前时间 239 | 240 | 241 | 00:00:00 242 | 243 | 244 | 245 | 246 | 247 | 248 | / 249 | 250 | 251 | 252 | 253 | 254 | 255 | 总时长 256 | 257 | 258 | 00:00:00 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | QAbstractScrollArea::AdjustToContents 268 | 269 | 270 | QListView::Adjust 271 | 272 | 273 | 274 | 0 275 | 32 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 0 288 | 0 289 | 800 290 | 26 291 | 292 | 293 | 294 | 295 | 文件 296 | 297 | 298 | 299 | 300 | 301 | 302 | 帮助 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | .. 314 | 315 | 316 | 打开 317 | 318 | 319 | Ctrl+O 320 | 321 | 322 | 323 | 324 | 325 | .. 326 | 327 | 328 | 退出 329 | 330 | 331 | Ctrl+Q 332 | 333 | 334 | 335 | 336 | 337 | .. 338 | 339 | 340 | 关于 341 | 342 | 343 | F1 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | -------------------------------------------------------------------------------- /preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sonichy/HTYVideoSpliter/a96bedc7f590b7f54a7f5d333e111ca64ceb43f0/preview.png -------------------------------------------------------------------------------- /res.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | icon.jpg 4 | cut.png 5 | add.png 6 | 7 | 8 | --------------------------------------------------------------------------------