#define TEST 2#if TEST == 1// Исходный подправленный до рабочего в моём случае вариант#define FIXED_GEOMETRY 1//#define FIXED_INTERNAL_WIDGETS_GEOMETRY 1#define RESET_AUTO_FILL_BG#define USE_BG_STYLE 1#define MARGIN 0#define SPACING 0#elif TEST == 2// То же что и 1 только более наглядно//#define FIXED_GEOMETRY 1#define FIXED_INTERNAL_WIDGETS_GEOMETRY 1#define RESET_AUTO_FILL_BG#define USE_BG_STYLE 1#define MARGIN 10#define SPACING 10#elif TEST == 3// А вот тут то оно и вылазит//#define FIXED_GEOMETRY 1#define FIXED_INTERNAL_WIDGETS_GEOMETRY 1//#define RESET_AUTO_FILL_BG#define USE_BG_STYLE 1#define MARGIN 10#define SPACING 10#elif TEST == 4// То же что и 3, но без использования стилей, работает, но фон со смещением//#define FIXED_GEOMETRY 1#define FIXED_INTERNAL_WIDGETS_GEOMETRY 1//#define RESET_AUTO_FILL_BG//#define USE_BG_STYLE 1#define MARGIN 10#define SPACING 10#else#error Unknown TEST number#endif//#define INHERIT_SCROLL_AREA 1#include <QApplication>#include <QHBoxLayout>#include <QScrollArea>#include <QTimer>#include <QWidget>#include <QPainter>/******************************************************/#ifndef INHERIT_SCROLL_AREAclass ScrollArea : public QWidget#elseclass ScrollArea : public QScrollArea#endif{ Q_OBJECT public: ScrollArea(QWidget *p); void addWidget(QWidget *, int stretch); signals: void layoutChanged(); private slots: void slotUpdateLayout(); private: QHBoxLayout *layout;#ifndef INHERIT_SCROLL_AREA QScrollArea *area;#endif};// Implementation#ifndef INHERIT_SCROLL_AREAScrollArea::ScrollArea(QWidget *p) : QWidget(p)#elseScrollArea::ScrollArea(QWidget *p) : QScrollArea(p)#endif{#ifndef INHERIT_SCROLL_AREA QHBoxLayout *mainlayout = new QHBoxLayout; mainlayout->setContentsMargins(MARGIN, MARGIN, MARGIN, MARGIN); mainlayout->setSpacing(SPACING); setLayout(mainlayout); area = new QScrollArea;#else QScrollArea* area = this;#endif area->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); area->setWidget(new QWidget);#ifndef FIXED_INTERNAL_WIDGETS_GEOMETRY area->setWidgetResizable(true);#endif//// area->setAttribute(Qt::WA_NoSystemBackground);// area->viewport()->setAttribute(Qt::WA_NoSystemBackground);// area->widget()->setAttribute(Qt::WA_NoSystemBackground);//// area->setAutoFillBackground(false);#ifdef RESET_AUTO_FILL_BG area->viewport()->setAutoFillBackground(false); area->widget()->setAutoFillBackground(false);#endif// area->widget()->setBackgroundRole(QPalette::NoRole);// area->setBackgroundRole(QPalette::NoRole); layout = new QHBoxLayout; layout->setContentsMargins(MARGIN, MARGIN, MARGIN, MARGIN); layout->setSpacing(SPACING); area->widget()->setLayout(layout);#ifndef INHERIT_SCROLL_AREA mainlayout->addWidget(area, 1);#endif connect(this, SIGNAL(layoutChanged()), SLOT(slotUpdateLayout()), Qt::QueuedConnection);}void ScrollArea::addWidget(QWidget *w, int stretch){ layout->addWidget(w, stretch); w->show(); emit layoutChanged();}void ScrollArea::slotUpdateLayout(){#ifdef INHERIT_SCROLL_AREA QScrollArea* area = this;#endif int h = area->widget()->sizeHint().height(); int w = area->widget()->sizeHint().width();// area->widget()->resize(w < area->viewport()->width() ? area->viewport()->width() : w, h); area->widget()->resize(w, h);}ScrollArea *a;/******************************************************/class TestWidget : public QWidget{ private: bool on; public: TestWidget(QWidget *parent = 0) : QWidget(parent), on(false) { } void enterEvent(QEvent *) { on = true; update(); } void leaveEvent(QEvent *) { on = false; update(); } void paintEvent(QPaintEvent *) { QPainter p(this); static QColor colorB = QColor(255, 255, 0, 127); if(on) p.fillRect(rect(), QBrush(colorB, Qt::Dense6Pattern)); else { p.setPen(QPen(colorB)); p.drawRect(rect().adjusted(0, 0, -1, -1)); } }};/******************************************************/int main(int argc, char ** argv){ Q_INIT_RESOURCE(qrc); QApplication app(argc, argv);#ifdef FIXED_GEOMETRY QWidget *wgt = new QWidget(0, Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);#else QWidget *wgt = new QWidget();#endif#ifdef USE_BG_STYLE wgt->setObjectName("TestMain"); wgt->setStyleSheet("QWidget#TestMain""{"" background-image: url(:/background.png);"" background-position: top left;"//" background-repeat: repeat-x;""}");#else QPalette pal = wgt->palette(); pal.setBrush(QPalette::Window, QBrush(QPixmap( ":/background.png"))); wgt->setPalette(pal);#endif#ifdef FIXED_GEOMETRY wgt->resize(500, 40); wgt->setFixedHeight(40);#endif QHBoxLayout *hb = new QHBoxLayout; hb->setContentsMargins(MARGIN,MARGIN,MARGIN,MARGIN); hb->setSpacing(SPACING); wgt->setLayout(hb); a = new ScrollArea(wgt); hb->addWidget(a, 1); wgt->show(); TestWidget *w = new TestWidget;#ifdef FIXED_INTERNAL_WIDGETS_GEOMETRY w->setFixedSize(100, 100);#endif a->addWidget(w, 1); TestWidget *w2 = new TestWidget;#ifdef FIXED_INTERNAL_WIDGETS_GEOMETRY w2->setFixedSize(100, 100);#endif a->addWidget(w2, 1); return app.exec();}#include "main.moc"
//#define INHERIT_SCROLL_AREA 1
area->setWidgetResizable(true);
area->widget()->resize(w < area->viewport()->width() ? area->viewport()->width() : w, h);
area->widget()->setAttribute(Qt::WA_NoSystemBackground);
area->viewport()->setAutoFillBackground(false); area->widget()->setAutoFillBackground(false);