Bit Wave! 一个播放器的开发实录 0x01 - 旧实现

Bit Wave播放器开发日志 #2

我的桌面环境是Arch Linux下的KDE Plasma, 那么首选框架自然是Qt. 考虑到可能会有的跨平台需求, Qt可能也是最好的解决方案(真会有人拿Java写播放器?).

最开始是拿QtWidgets写界面, 舒服倒是挺舒服的, 只是QtWidgets没有太多关于控件分层的实现方式, 比如我想让播放栏和标题栏覆盖在页面之上, 并设置一个透明度让它们在播放视频时不会挡到下面的视频内容, 左思右想也没有想到比较优雅的实现, 最后采用了最简单粗暴又丑陋的办法: 响应resizeEventmoveEvent, 然后在事件更新的时候计算出这两个控件的绝对位置和大小, 然后设置一个绝对位置过去.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/* 窗口移动函数 */
void MainWindow::mousePressEvent(QMouseEvent *event) {
if (this->isMaximized()) return;
this->m_isMoving = true;
this->m_movePosition = event->globalPos() - pos();
return QMainWindow::mousePressEvent(event);
}

void MainWindow::mouseMoveEvent(QMouseEvent *event) {
if (this->isMaximized()) return;
if (this->m_isMoving && (event->buttons() & Qt::LeftButton) &&
(event->globalPos() - m_movePosition).manhattanLength() >
QApplication::startDragDistance()) {
move(event->globalPos() - m_movePosition);
this->m_movePosition = event->globalPos() - pos();
}
return QMainWindow::mouseMoveEvent(event);
}

void MainWindow::mouseReleaseEvent(QMouseEvent *event) {
this->m_isMoving = false;
event->accept();
}

void MainWindow::resizeEvent(QResizeEvent *event) {
QWidget::resizeEvent(event);
this->setupFloatingWidgets();
}

void MainWindow::moveEvent(QMoveEvent *event) {
QWidget::moveEvent(event);
}

void MainWindow::setupFloatingWidgets() {
QRect title_bar_rect(ui->sideBar->x() + ui->sideBar->width(), ui->sideBar->y(),
this->width() - ui->sideBar->width() + (this->isMaximized() ? 0 : -2), 32);
this->titleBar->setGeometry(title_bar_rect);
QRect control_bar_rect(ui->sideBar->x() + ui->sideBar->width(),
this->height() - 100 + (this->isMaximized() ? 0 : -1),
this->width() - ui->sideBar->width() + (this->isMaximized() ? 0 : -2), 100);
this->controlBar->setGeometry(control_bar_rect);
QRect queue_bar_rect(this->width() - 290, this->titleBar->y() + 8 + this->titleBar->height(), 280,
this->height() - this->titleBar->height() - this->controlBar->height() - 16);
this->queueBar->setGeometry(queue_bar_rect);
this->progressControlBar->setGeometry(this->controlBar->x(), this->controlBar->y() - 12, this->controlBar->width(),
24);
}

再然后是样式的问题. Qt没有给你暴露怎么去更改一个svg图标颜色的接口, 这就导致了如果想用原生

评论

:D 一言句子获取中...