如何将背景图片添加到QMainWindow?

12

你好,我刚接触QT Creator。我尝试了很多方法来为Q主窗口设置背景图片。我添加了一个带有我的图片的资源文件夹,试图在UI中使用setstylesheet和编程方式添加。当我使用UI时,我可以看到图片,但是运行时没有显示出来。我想把一张扑克桌的图片作为背景,并能在上面放置按钮等元素。

main.cpp:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();


    return a.exec();
}

主窗口.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setStyleSheet("{background-image: url(:/images/images/PokerTableBackground.jpg);}");
}

MainWindow::~MainWindow()
{
    delete ui;
}

就像我说的那样,我尝试过这样做,并通过 UI 将图像放置其中,但两者都无法正常工作。我希望将该图像设置为整个背景。

我还尝试使用以下方法:

QWidget *pic = new QWidget(ui->tab);
    pic->setStyleSheet("background-image: url(:/images/images/PokerTableBackground.jpg)");
    pic->setGeometry(QRect(10,10,220,48)); // your location and size.

你把 *pic 元素绘制到窗口的哪里? - Phorce
在mainwindow.cpp类中,可以这样写: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QWidget *pic = new QWidget(this); pic->setStyleSheet("background-image: url(:/images/images/PokerTableBackground.jpg)"); pic->setGeometry(QRect(10,10,220,48)); // 设置位置和大小。 } - Sahil Gupta
尽量避免使用CSS样式表。它们容易出现错误,难以调试和维护。 - max
3个回答

28

您可以通过以下步骤向您的MainWindow添加背景图片:

  1. 创建一个QPixmap并将其路径设置为您的图像。
  2. 创建一个QPalette并将其QBrush设置为您的像素图和其ColorRole设置为QPalette::Window
  3. 将您的MainWindow调色板设置为您创建的调色板。

例如,您可以将这些行添加到MainWindow类的构造函数中:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QPixmap bkgnd("/home/user/Pictures/background.png");
    bkgnd = bkgnd.scaled(this->size(), Qt::IgnoreAspectRatio);
    QPalette palette;
    palette.setBrush(QPalette::Window, bkgnd);
    this->setPalette(palette);
}

这个的优点是,你可以通过编程的方式修改/更改背景图像,而无需使用或学习任何CSS样式表语法。

根据我的个人经验,样式表效果更好。但这只是对我而言。 - cubuspl42
2
@cubuspl42 是的,它们可以正常工作,但对于那些不习惯 CSS 样式表语法或者没有时间学习或者不经常处理此类任务的人来说,这是一个更合适的解决方案。 - max
1
我同意Barracuda的观点。这个解决方案立即生效,而且还让我可以为高DPI显示器缩放图像。很好的解决方案。谢谢! - user761576
2
QPalette::Background已经过时,请使用QPalette::Window代替。https://doc.qt.io/qt-5/qpalette.html - Ayxan Haqverdili

14

你可以设置中心窗口的背景样式表,

this->centralWidget()->setStyleSheet("background-image:url(\"bkg.jpg\"); background-position: center; ");

在构造函数中,代码可能是这样的:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    this->centralWidget()->setStyleSheet(
         "background-image:url(\"bkg.jpg\"); background-position: center;" );
}

8

CSS样式background会在子部件中继承,从而创建奇怪的窗口。一种可能的解决方案是将背景限制为MainWindow#centralWidget。如果您还想拉伸图像以覆盖整个部件,请使用这种类型的CSS

this->setStyleSheet(
            "#centralWidget { "
            " border-image: url(:/background.png) 0 0 0 0 stretch stretch;"
            "}");

1
我的项目没有任何进展。你确定你的代码是正确的吗? - Amir Mohsen
它已经编译过了,我已经用Qt5测试过了。但是如果它是“正确的”,我无法告诉你,毕竟什么样的代码才是正确的呢? - DomTomCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接