Russian Qt Forum
Июнь 03, 2024, 20:13 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: прозрачный фон  (Прочитано 12526 раз)
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #15 : Июль 31, 2008, 21:25 »

вот переделал без scrollarea, всё работает хорошо. Посмотрите и этот пример пожалуйста. Там 3 вложенных виджета в hboxlayout'е, каждый должен подсвечиваться нормально. Под виндой результат конечно может отличаться, но мне бы заставить работать хотя бы в Linux Улыбающийся
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #16 : Июль 31, 2008, 21:35 »

Интересная ситуация получаеться. Под линуксом пример со scrollarea работает нормально как с макросом так и без него. Ситуация полностью противоположная чем винде.

openSuse 10.3, Qt 4.4.0
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
spirit
Гость
« Ответ #17 : Июль 31, 2008, 21:47 »

да уж, странно. этот пример пашет на ура под виндой. очень интересно.
Записан
Alex03
Гость
« Ответ #18 : Август 01, 2008, 08:07 »

У меня WinXP Qt 4.3.3
Исходный пример не работал в обоих случаях

Подправил до такого (поиграйтесь со значениями TEST, да и прочими дефайнами):
Код:
#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_AREA
class ScrollArea : public QWidget
#else
class 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_AREA
ScrollArea::ScrollArea(QWidget *p) : QWidget(p)
#else
ScrollArea::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);


Ну и ИМХО если уж тользовать SсrollХХХХ то пользовать, а отрисовку всяко полезно отлаживать в различныз геометриях, а не с фикседсайз. Да и нулевые MARGIN-ы/SPACING-и тоже при отладке не есть гуд.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #19 : Август 01, 2008, 09:51 »

Хм... весьма странно. Проблема решилась заменой

Код:
    area->widget()->setAttribute(Qt::WA_NoSystemBackground);

Код:
    area->viewport()->setAutoFillBackground(false);
    area->widget()->setAutoFillBackground(false);

в оригинальном примере. наверно сыграло роль то, что setAutoFillBackground не совсем хорошо документирован, поэтому я его не учёл Улыбающийся Отдельное спасибо Alex03 за проделанную работу, которая и навела меня на мысль Улыбающийся

Такой бутерброд необходим, т.к. самый верхний виджет и его layout - не мои, я туда вставляю свой плагин, который и будет наследником QScrollArea.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 19.