Qt - 创建圆角窗口并设置背景图片
方法一:使用样式表(QSS) - 推荐
1. 基本圆角窗口
// 在构造函数中设置
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// 设置窗口无边框
setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
// 设置背景颜色和圆角
setStyleSheet(R"(
QMainWindow {
background-color: white;
border: 2px solid #cccccc;
border-radius: 15px;
}
)");
// 可选:设置窗口大小
resize(800, 600);
}
2. 圆角窗口 + 背景图片
// 设置带有背景图片的圆角窗口
setStyleSheet(R"(
QMainWindow {
background-image: url(:/images/background.jpg);
background-position: center;
background-repeat: no-repeat;
background-color: #f0f0f0;
border: none;
border-radius: 20px;
}
)");
方法二:重写 paintEvent 方法
class RoundedWindow : public QMainWindow {
protected:
void paintEvent(QPaintEvent *event) override {
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
// 创建圆角路径
QPainterPath path;
path.addRoundedRect(rect(), 15, 15);
// 设置裁剪区域
painter.setClipPath(path);
// 绘制背景图片
QPixmap bg(":/images/background.jpg");
if (!bg.isNull()) {
painter.drawPixmap(rect(), bg);
} else {
// 如果没有图片,绘制颜色背景
painter.fillRect(rect(), QColor("#f0f0f0"));
}
QMainWindow::paintEvent(event);
}
};
方法三:使用QFrame作为容器
// 主窗口构造函数中
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// 设置无边框
setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
// 创建QFrame作为中央部件
QFrame *centralFrame = new QFrame(this);
centralFrame->setObjectName("centralFrame");
setCentralWidget(centralFrame);
// 设置样式
centralFrame->setStyleSheet(R"(
#centralFrame {
background-image: url(:/images/background.jpg);
background-position: center;
background-repeat: no-repeat;
background-origin: content;
border: none;
border-radius: 20px;
}
)");
// 设置窗口背景透明
setAttribute(Qt::WA_TranslucentBackground);
}
方法四:完整示例(带阴影和可拖动)
// 圆角窗口类
class RoundedWindow : public QMainWindow {
Q_OBJECT
public:
RoundedWindow(QWidget *parent = nullptr)
: QMainWindow(parent)
{
// 设置窗口属性
setWindowFlags(Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);
// 主Widget
QWidget *centralWidget = new QWidget(this);
centralWidget->setObjectName("mainWidget");
setCentralWidget(centralWidget);
// 设置样式表
centralWidget->setStyleSheet(R"(
#mainWidget {
background: qlineargradient(x1:0, y1:0, x2:1, y2:1,
stop:0 #667eea, stop:1 #764ba2);
border-radius: 20px;
border: 2px solid rgba(255, 255, 255, 0.2);
}
)");
// 添加布局和内容
QVBoxLayout *layout = new QVBoxLayout(centralWidget);
layout->addWidget(new QLabel("圆角窗口", this));
// 设置阴影效果
QGraphicsDropShadowEffect *shadow = new QGraphicsDropShadowEffect();
shadow->setBlurRadius(20);
shadow->setColor(QColor(0, 0, 0, 100));
shadow->setOffset(0, 0);
centralWidget->setGraphicsEffect(shadow);
resize(400, 300);
}
protected:
// 实现窗口拖动
void mousePressEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
m_dragPosition = event->globalPos() - frameGeometry().topLeft();
event->accept();
}
}
void mouseMoveEvent(QMouseEvent *event) override {
if (event->buttons() & Qt::LeftButton) {
move(event->globalPos() - m_dragPosition);
event->accept();
}
}
private:
QPoint m_dragPosition;
};
注意事项:
-
资源文件:如果使用背景图片,确保将图片添加到.qrc资源文件中
-
性能考虑:复杂的背景图片可能影响性能,建议优化图片尺寸
-
高DPI支持:在高DPI屏幕上,使用
setScaledContents(true)或适配图片分辨率 -
子控件:圆角窗口中的子控件不会自动被裁剪,如有需要可单独设置

浙公网安备 33010602011771号