不解析,直接给代码例子
利用窗口重绘事件处理函数paintEvent
main.cpp
cpp
#include <QtCore/qglobal.h>
#if QT_VERSION >= 0x050000
#include <QtWidgets/QApplication>
#else
#include <QtGui/QApplication>
#endif
#include "roundedwindow.h"
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
RoundedWindow wnd{};
wnd.init();
return a.exec();
}
roundedwindow.h
cpp
#ifndef ROUNDEDWINDOW_H
#define ROUNDEDWINDOW_H
#include <QtCore/qglobal.h>
#if QT_VERSION >= 0x050000
#include <QtWidgets/QWidget>
#else
#include <QtGui/QWidget>
#endif
class RoundedWindow : public QWidget {
Q_OBJECT
public:
explicit RoundedWindow(QWidget *parent = nullptr);
void init();
protected:
void paintEvent(QPaintEvent *event) override;
signals:
};
#endif // ROUNDEDWINDOW_H
roundedwindow.cpp
cpp
#include "roundedwindow.h"
#include <QPainter>
#include <QPushButton>
#include <QVBoxLayout>
RoundedWindow::RoundedWindow(QWidget *parent) : QWidget{parent} {
/* setAttribute 与 setWindowFlag 尽量写在构造函数,写在其他操作之前 */
// 背景透明
this->setAttribute(Qt::WA_TranslucentBackground, true);
// 无边框
this->setWindowFlag(Qt::FramelessWindowHint);
}
void RoundedWindow::init() {
this->show();
QLayout *mainLayout = new QVBoxLayout{this};
QPushButton *btn = new QPushButton{this};
btn->setText(QStringLiteral("你好"));
mainLayout->addWidget(btn);
this->setLayout(mainLayout);
}
void RoundedWindow::paintEvent(QPaintEvent *event) {
QPainter painter{this};
painter.setRenderHint(QPainter::Antialiasing); // 抗据齿,绘图更加平滑
painter.setBrush(QBrush{QColor{155, 54, 54}});
painter.drawRoundedRect(this->rect(), 15, 15);
}
利用qss改变主窗口样式
main.cpp
cpp
#include <QtCore/qglobal.h>
#if QT_VERSION >= 0x050000
#include <QtWidgets/QApplication>
#else
#include <QtGui/QApplication>
#endif
#include "roundedwindow.h"
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
RoundedWindow wnd{};
wnd.init();
return a.exec();
}
roundedwindow.h
cpp
#ifndef ROUNDEDWINDOW_H
#define ROUNDEDWINDOW_H
#include <QtCore/qglobal.h>
#if QT_VERSION >= 0x050000
#include <QtWidgets/QWidget>
#else
#include <QtGui/QWidget>
#endif
class RoundedWindow : public QWidget {
Q_OBJECT
public:
explicit RoundedWindow(QWidget *parent = nullptr);
void init();
protected:
void paintEvent(QPaintEvent *event) override;
signals:
};
#endif // ROUNDEDWINDOW_H
roundedwindow.cpp
cpp
#include "roundedwindow.h"
#include <QPainter>
#include <QPushButton>
#include <QStyleOption>
#include <QVBoxLayout>
RoundedWindow::RoundedWindow(QWidget *parent) : QWidget{parent} {
/* setAttribute 与 setWindowFlag 尽量写在构造函数,写在其他操作之前 */
// 背景透明
this->setAttribute(Qt::WA_TranslucentBackground, true);
// 无边框
this->setWindowFlag(Qt::FramelessWindowHint);
}
void RoundedWindow::init() {
this->show();
this->setStyleSheet("QWidget {"
" background-color:gray;"
" border-radius:15px;"
"}");
}
void RoundedWindow::paintEvent(QPaintEvent *event) {
Q_UNUSED(event);
/* qwidget的qss仅支持background、background-clip和background-origin属性。
* 如果您继承QWidget,则需要为自定义QWidget提供paintEvent,如下所示 */
QStyleOption opt;
opt.initFrom(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}