Как добавить фоновое изображение в QWidget без использования QMainWindow? - PullRequest
2 голосов
/ 06 мая 2020

Изменить: Проблема еще не решена, я временно использовал ответ @Scheff в качестве временного решения.

Можно ли добавить изображение в качестве фона в приложение-виджет Qt, созданное с помощью QWidget в качестве базового класса? Я здесь вообще не использую QMainWindow.

В Qt Creator вы можете сгенерировать скелетные файлы исходного кода при создании нового проекта. Если вы выберете QWidget в качестве базового класса и попытаетесь добавить изображение в качестве фона, изменив таблицу стилей виджетов (вручную или из раздела дизайна IDE), изображение не появится при сборке проекта. . Как я могу это исправить, если это возможно?

Я создаю файл ресурсов Qt, добавляю изображение (которое находится в каталоге исходного кода) и устанавливаю таблицу стилей. Вот и все. Но если я добавлю цвет фона с

Widget->setStyleSheet(QString::fromUtf8("#Widget {background-color: rgb(55,55,55)};")); 

в ui_widget.h , он будет работать нормально и появится после сборки.

И если я просматриваю виджет из внутри Qt Creator изображение появляется, но не после сборки и запуска.

Здесь вы выбираете QWidget в качестве базового класса в Qt Creator:

Creating a new project in Qt Creator

Это главный. cpp:

#include "widget.h"
#include <QtCore/qglobal.h>
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

Это ui_widget.h:

#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE
class Ui_Widget
{ 
public:
    void setupUi(QWidget *Widget)
    {
        if (Widget->objectName().isEmpty())
            Widget->setObjectName(QString::fromUtf8("Widget"));
        Widget->resize(600, 150);

        // I add this line, if I changed the style sheet to a simple background color it shows up with no problem {background-color: rgb(1,1,200)}
        Widget->setStyleSheet(QString::fromUtf8("#Widget {background-image: url(:/pic.jpg);}"));

        retranslateUi(Widget);
        QMetaObject::connectSlotsByName(Widget);
    } // setupUi

    void retranslateUi(QWidget *Widget)
    {
        Widget->setWindowTitle(QApplication::translate("Widget", "Widget", nullptr));
    } // retranslateUi

};

namespace Ui {
    class Widget: public Ui_Widget {};
} // namespace Ui

QT_END_NAMESPACE

Это widget.h:

#include <QtCore/qglobal.h>
#include <QtWidgets/QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private:
    Ui::Widget *ui;
};

Это виджет. cpp:

#include "widget.h"
#include "ui_widget.h"

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

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

Извините за добавление всего сгенерированного кода, но это может быть полезно, спасибо.

1 Ответ

2 голосов
/ 06 мая 2020

Из любопытства попробовал на своей стороне со своим MCVE .

Исходный код C ++ testQWidgetBackgroundImage.cc:

// Qt header:
#include <QtWidgets>

// main application
int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  QWidget qWinMain;
  qWinMain.setWindowTitle("Test Background Image");
  qWinMain.resize(640, 480);
  qWinMain.setObjectName("Widget");
  qWinMain.setStyleSheet("#Widget { background-image: url(cat.jpg); }");
  qWinMain.show();
  // runtime loop
  return app.exec();
}

Скрипт сборки CMakeLists.txt:

project(QWidgetBackgroundImage)

cmake_minimum_required(VERSION 3.10.0)

set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

find_package(Qt5Widgets CONFIG REQUIRED)

include_directories("${CMAKE_SOURCE_DIR}")

add_executable(testQWidgetBackgroundImage testQWidgetBackgroundImage.cc)

target_link_libraries(testQWidgetBackgroundImage Qt5::Widgets)

Вывод:

snapshot of testQWidgetBackgroundImage.exe

Итак, я смог показать простой QWidget с фоновым изображением, установленным таблица стилей, по крайней мере, в Windows 10 с VS 2017 и Qt 5.13.

Это соответствует тому, что описано в Справочник по таблицам стилей Qt - фон :

Сокращенное обозначение для установки фона. Эквивалентно указанию background-color, background-image, background-repeat и / или background-position.

Это свойство поддерживается подклассами QAbstractItemView, подклассами QAbstractSpinBox, QCheckBox, QComboBox, QDialog, QFrame, QGroupBox, QLabel , QLineEdit, QMenu, QMenuBar, QPushButton, QRadioButton, QSplitter, QTextEdit, QToolTip и обычные QWidgets.

Примечание:

Я должен признать, что я не У меня нет опыта использования ресурсов Qt. Следовательно, я предоставил URL-адрес как url(cat.jpg), что приводит к попытке загрузки из файла в локальном текущем рабочем каталоге (с успехом, как показано на снимке выше). Префикс с : (например, url(:/cat.jpg)) вместо этого будет адресовать запись в ресурсах Qt.

Дальнейшие чтения: Система ресурсов Qt


Прочитав до c. в приведенной выше ссылке я заметил, что это не так сложно использовать, и немного изменил приведенный выше MCVE:

Исходный файл C ++ testQWidgetBackgroundImage.cc

// Qt header:
#include <QtWidgets>

// main application
int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  QWidget qWinMain;
  qWinMain.setWindowTitle("Test Background Image");
  qWinMain.resize(640, 480);
  qWinMain.setObjectName("Widget");
  qWinMain.setStyleSheet("#Widget { background-image: url(:/cat.jpg); }");
  qWinMain.show();
  // runtime loop
  return app.exec();
}

Фактически, единственное изменение было url(cat.jpg)url(:/cat.jpg).

Файл ресурсов Qt testQWidgetBackgroundImage.qrc:

<!DOCTYPE RCC>
<RCC version="1.0">
  <qresource>
    <file>cat.jpg</file>
  </qresource>
</RCC>

Файл проекта Qt testQWidgetBackgroundImage.pro:

SOURCES = testQWidgetBackgroundImage.cc

RESOURCES = testQWidgetBackgroundImage.qrc

QT += widgets

Создан и протестирован в cygwin64 :

$ qmake-qt5 testQWidgetBackgroundImage.pro

$ make && ./testQWidgetBackgroundImage 
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQWidgetBackgroundImage.o testQWidgetBackgroundImage.cc
/usr/lib/qt5/bin/rcc -name testQWidgetBackgroundImage testQWidgetBackgroundImage.qrc -o qrc_testQWidgetBackgroundImage.cpp
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o qrc_testQWidgetBackgroundImage.o qrc_testQWidgetBackgroundImage.cpp
g++  -o testQWidgetBackgroundImage.exe testQWidgetBackgroundImage.o qrc_testQWidgetBackgroundImage.o   -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread 
Qt Version: 5.9.4

Вывод:

snapshot of ./testQWidgetBackgroundImage

...