Hi,
I have a problem handling background in custom widget. I want to post here my code and attach a screenshoot of the final application to show you the problem I'm facing.
I start with the screenshot (bad result):
[ATTACH]screenshot..jpg[/ATTACH]
I defined a main composed class, MainWindow (in mainwindow.h) that set in its constructor a background obtained from a image. Then a child subclass, Widget, are created and added to a vertical layout.
/**
* @file mainwindow.h
*/
#include <QtGui>
#include "widget.h"
{
Q_OBJECT
public:
{
palette.setBrush(backgroundRole(),
setPalette(palette);
setAutoFillBackground(true);
Widget *widget = new Widget(this);
layout->setContentsMargins(0, 0, 0, 0);
layout->addWidget(widget);
layout->addStretch(1);
setLayout(layout);
}
};
/**
* @file mainwindow.h
*/
#include <QtGui>
#include "widget.h"
class MainWindow : public QWidget
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0)
: QWidget(parent)
{
setBackgroundRole(QPalette::Window);
QPalette palette;
palette.setBrush(backgroundRole(),
QBrush(QImage(":/icons/background.png")));
setPalette(palette);
setAutoFillBackground(true);
Widget *widget = new Widget(this);
QVBoxLayout *layout = new QVBoxLayout;
layout->setContentsMargins(0, 0, 0, 0);
layout->addWidget(widget);
layout->addStretch(1);
setLayout(layout);
}
};
To copy to clipboard, switch view to plain text mode
Here the code for Widget class:
/**
* @file widget.h
*/
#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui>
#include "widget.h"
#include "pages.h"
{
Q_OBJECT
public:
{
setFixedSize(320, 240);
selectedGroupBox->setFlat(true);
selectedGroupBox->setLayout(selectedLayout);
scrollArea->setWidgetResizable(true);
selectWidgets();
buttonBox->setOrientation(Qt::Vertical);
rotateButton = buttonBox->addButton(tr("Select &Widgets"),
connect(rotateButton, SIGNAL(clicked()), this, SLOT(selectWidgets()));
mainLayout->addWidget(selectedGroupBox, 0, 0);
mainLayout->setRowStretch(1, 1);
mainLayout->addWidget(buttonBox, 0, 1);
mainLayout->setContentsMargins(0, 0, 0, 0);
mainLayout
->setSizeConstraint
(QLayout::SetMinimumSize);
setLayout(mainLayout);
}
private slots:
void selectWidgets()
{
switch (index) {
case 0: widget = new ConfigPage;
break;
case 1: widget = new UpdatePage;
break;
case 2: widget = new QueryPage;
break;
}
scrollArea->setWidget(widget);
scrollArea->ensureWidgetVisible(widget);
selectedLayout->addWidget(scrollArea, 0, 0);
index = (++index) % 3;
}
private:
int index;
};
#endif // WIDGET_H
/**
* @file widget.h
*/
#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui>
#include "widget.h"
#include "pages.h"
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0)
: QWidget(parent), index(0)
{
setFixedSize(320, 240);
setBackgroundRole(QPalette::Window);
selectedGroupBox = new QGroupBox;
selectedGroupBox->setFlat(true);
selectedLayout = new QGridLayout;
selectedGroupBox->setLayout(selectedLayout);
scrollArea = new QScrollArea();
scrollArea->setWidgetResizable(true);
selectWidgets();
buttonBox = new QDialogButtonBox;
buttonBox->setOrientation(Qt::Vertical);
rotateButton = buttonBox->addButton(tr("Select &Widgets"),
QDialogButtonBox::ActionRole);
connect(rotateButton, SIGNAL(clicked()), this, SLOT(selectWidgets()));
mainLayout = new QGridLayout;
mainLayout->addWidget(selectedGroupBox, 0, 0);
mainLayout->setRowStretch(1, 1);
mainLayout->addWidget(buttonBox, 0, 1);
mainLayout->setContentsMargins(0, 0, 0, 0);
mainLayout->setSizeConstraint(QLayout::SetMinimumSize);
setLayout(mainLayout);
}
private slots:
void selectWidgets()
{
switch (index) {
case 0: widget = new ConfigPage;
break;
case 1: widget = new UpdatePage;
break;
case 2: widget = new QueryPage;
break;
}
scrollArea->setWidget(widget);
scrollArea->ensureWidgetVisible(widget);
selectedLayout->addWidget(scrollArea, 0, 0);
index = (++index) % 3;
}
private:
QDialogButtonBox *buttonBox;
QGroupBox *selectedGroupBox;
QWidget *widget;
int index;
QPushButton *rotateButton;
QGridLayout *mainLayout;
QGridLayout *selectedLayout;
QScrollArea *scrollArea;
};
#endif // WIDGET_H
To copy to clipboard, switch view to plain text mode
The Widget class uses others three child classes derived from QWidget, contained in pages.h: they are ConfigPage, QueryPage and UpdatePage and use various othe widgets from Qt library. They are layed into a QScroll area in the Widget class every time user pushs the rotateButton.
I don't like the way the background image propagates through the Widget object and its sub childs.
I think the problem is due to the fact that child widgets "import" the background image applying its window constraint and properties (size, styles, etc) when reproducing the background image.
How can I solve the problem?
Thaks in advance for your help or suggestions.
Bookmarks