Qt - 创建圆角窗口并设置背景图片

方法一:使用样式表(QSS) - 推荐

1. 基本圆角窗口

cpp
 
 
 
 
// 在构造函数中设置
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. 圆角窗口 + 背景图片

cpp
 
 
 
 
// 设置带有背景图片的圆角窗口
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 方法

cpp
 
 
 
 
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作为容器

cpp
 
 
 
 
// 主窗口构造函数中
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);
}

方法四:完整示例(带阴影和可拖动)

cpp
 
 
 
 
// 圆角窗口类
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;
};

注意事项:

  1. 资源文件:如果使用背景图片,确保将图片添加到.qrc资源文件中

  2. 性能考虑:复杂的背景图片可能影响性能,建议优化图片尺寸

  3. 高DPI支持:在高DPI屏幕上,使用setScaledContents(true)或适配图片分辨率

  4. 子控件:圆角窗口中的子控件不会自动被裁剪,如有需要可单独设置

posted @ 2026-01-19 18:20  [BORUTO]  阅读(1)  评论(0)    收藏  举报