• 作者:老汪软件技巧
  • 发表时间:2024-09-05 17:01
  • 浏览量:

最新大型开源项目-云游戏,云桌面系统,欢迎关注

GammaRay源码地址

实现目标

我们将通过Qt和C++,完全使用QPainter的方式来完成整个应用界面的开发,并使用VLC来实现音频的播放

代码地址

源码

设计图

实现截图

1.创建项目

在QtCreator中,File->New File or Project ,然后按照提示创建

1.1 选择 Application -> Qt Widgets Application

1.2 起一个项目名并指定保存文件夹,随后都保持默认即可,直到最后完成

1.3 选择完成即可创建成功

2.修改基础代码2.1 修改MainWindow,继承自QWidget并实现paintEvent方法

主要实现无边框窗口,窗口阴影和窗口圆角

class MainWindow : public QWidget
{
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void paintEvent(QPaintEvent* ev) override;
};

2.1.1 实现无边框,在构造函数添加如下代码

MainWindow::MainWindow(QWidget *parent)
    : QWidget(parent) {
    // 实现无边框窗口
    setWindowFlags(Qt::FramelessWindowHint);
    // 设置背景透明
    setAttribute(Qt::WA_TranslucentBackground);
...

2.1.2 实现边框阴影

注意,此时执行代码还不能看见阴影效果,还需要第三步配合

MainWindow::MainWindow(QWidget *parent)
    : QWidget(parent) {
    setWindowFlags(Qt::FramelessWindowHint);
    setAttribute(Qt::WA_TranslucentBackground);
    // 将会产生阴影,可以调整阴影的颜色和大小,通过setColor 和 setBlurRadius
    auto shadow = new QGraphicsDropShadowEffect(this);
    shadow->setOffset(0, 0);
    shadow->setColor(QColor(0x666666));
    shadow->setBlurRadius(12);
    this->setGraphicsEffect(shadow);
...
}

2.1.3 实现paintEvent,最终实现圆角和阴影

做完这一步才能显示阴影的原因,是因为开始已经把窗口设置成了透明,窗口需要有内容,且窗口需要向内部偏移一点,给阴影留出空间

void MainWindow::paintEvent(QPaintEvent *ev) {
    QPainter painter(this);
    painter.setRenderHint(QPainter::RenderHint::Antialiasing);
    int radius = 10;
    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(QColor(0xffffff)));
    //这里向内偏移了5像素,给阴影留出空间
    int padding = 5;
    QRect inner_rect(padding, padding, this->rect().width()-padding*2, this->rect().height()-padding*2);
    // 绘制圆角
    painter.drawRoundedRect(inner_rect, radius, radius);
}

到此,就实现了圆角,无边框,有阴影的主体窗口了,下一节我们将添加一个标题栏,用于拖动它。