Russian Qt Forum

Qt => QSS => Тема начата: lighting от Май 15, 2009, 16:05



Название: CSS и background-image
Отправлено: lighting от Май 15, 2009, 16:05
Наверняка вопрос простой, но я как начинающий в QT провозился с ним уже много и ответа для своего случая на форуме не нашел.
Итак, имеется проект со следующими файлами:
PreviewWindow.h
Код
C++ (Qt)
#ifndef PREVIEWWINDOW_H
#define PREVIEWWINDOW_H
 
#include <QWidget>
 
class QPushButton;
 
class PreviewWindow : public QWidget
{
    Q_OBJECT
 
public:
    PreviewWindow(QWidget *parent = 0);
 
private:
    QPushButton *closeButton;
};
 
#endif
 

PreviewWindow.cpp
Код
C++ (Qt)
#include <QtGui>
#include "previewwindow.h"
 
PreviewWindow::PreviewWindow(QWidget *parent)
    : QWidget(parent)
{
    closeButton = new QPushButton(tr("&Close"));
    connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
 
    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(closeButton);
    this->setLayout(layout);
//     QPalette pal = palette();
//     pal.setBrush(QPalette::Window, QBrush(QPixmap("C:/Qt/projects/Test/img/btn_up.jpg")));
//     closeButton->setPalette(pal);
    setStyleSheet("QPushButton {background-image: url(C:/Qt/projects/Test/img/btn_up.jpg); border: none; height: 61; width: 186; font: bold; font-size: 18px; color: #06EAF7; } QPushButton:pressed { background-image: url(:/img/btn_down.jpg); padding-left: 2px; padding-top: 2px; color: #F4BB0D;}");
}
 

controllerwindow.h
Код
C++ (Qt)
#ifndef CONTROLLERWINDOW_H
#define CONTROLLERWINDOW_H
 
#include <QWidget>
#include "previewwindow.h"
 
class QLabel;
class QPushButton;
 
class ControllerWindow : public QWidget
{
    Q_OBJECT
 
public:
    ControllerWindow();
 
private slots:
    void ShowWindow();
 
private:
 
    PreviewWindow *previewWindow;
 
    QPushButton *quitButton;
    QPushButton *showWindowButton;
};
 
#endif
 
controllerwindow.cpp
Код
C++ (Qt)
#include <QtGui>
#include "controllerwindow.h"
 
ControllerWindow::ControllerWindow()
{
    previewWindow = new PreviewWindow(this);
 
    quitButton = new QPushButton(tr("&Quit"));
    connect(quitButton, SIGNAL(clicked()), qApp, SLOT(quit()));
 
    showWindowButton = new QPushButton(tr("&Show window"));
    connect(showWindowButton, SIGNAL(clicked()), this, SLOT(ShowWindow()));
 
    QHBoxLayout *bottomLayout = new QHBoxLayout;
    bottomLayout->addStretch();
    bottomLayout->addWidget(quitButton);
 
    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(showWindowButton);
    mainLayout->addLayout(bottomLayout);
    setLayout(mainLayout);
 
    setWindowTitle(tr("Test"));    
}
 
void ControllerWindow::ShowWindow()
{
    Qt::WindowFlags flags = 0;
    flags = Qt::SplashScreen;
    flags |= Qt::FramelessWindowHint;
    previewWindow->setWindowFlags(flags);
 
    previewWindow->setWindowState(Qt::WindowFullScreen);
    previewWindow->show();
}
 
main.cpp
Код
C++ (Qt)
#include <QApplication>
#include "controllerwindow.h"
 
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    ControllerWindow controller;
    controller.show();
    return app.exec();
}
 

1 - При любых раскладах (и с абсолютным путем к jpg и с относительным, и с css и с QPalette (закоментированным выше)) картинки у меня не подгружаются в принципе. Если менять background, color или любой другой атрибут css то все отображается нормально, но с картинками выходит полный облом. Как это побороть?

2 - В окне ContorollerWindow при запуске появляется кнопка Close которая каким-то образом попадает туда из окна previewwindow т.к. изменение стиля влияет и на нее. Если ее нажать, то она исчезает. Так-же она исчезает если закрыть окно previewwindow, но вот откуда она берется?

Пробую все под WinXP, qt 4.5.0


Название: Re: CSS и background-image
Отправлено: xokc от Май 15, 2009, 18:31
Использовать синтаксис url(./images/back.png),
где images/back.png - путь относительно папки, где лежит exe файл.


Название: Re: CSS и background-image
Отправлено: lighting от Май 16, 2009, 21:20
xokc спасибо, это помогло. А по поводу неизвестно откуда появляющейся кнопки ничего подсказать не можешь?


Название: Re: CSS и background-image
Отправлено: break от Май 17, 2009, 03:12
у меня такие стайл-шиты:

Код:
setStyleSheet("QPushButton {background-image: url(C:/Qt/projects/Test/img/btn_up.jpg);}");

корректно работали даже с абсолютным путем(Linux), но при применении такого стиля к окну (QWidget) - в не которых версиях Qt в упор не хотело работать - приходилось в окне размещать QFrame - кот. растягивался на весь размер окна - и для него устанавливать этот стиль - тогда уже все корректно работало (то есть бекграунд не применялся к родительскому виджету) - в каких версиях это происходило точно не вспомню (4.3, 4.4 ... )

еще были проблемы  бекграунда заданного через стиль с формами загружаемыми через uiLoader, также не помню точно версии Qt

еще были проблемы что работает в программе - но не показывается в дизайнере, особенно если картинка лежит не файлом на диске а в рсурсах (что для меня было удобно), поэтому в конце концов стал так делать:

Еслина на виджете будет задаваться бекграунд стилем - то у этого виджета есть QFrame занимающий всю область - и стиль применен к нему

Картинка лежит в ресурсе

Если требуется работать в дизайнере и видеть этот фон, тол либо подгружать файл ресурса к форме - либо держать второй стиль (или кусочек) - где этот бекграунд указан как абсолютный файл на диске а не в ресурсе.