Qt4 vs Qt5 i QGraphicsEffect

Odpowiedz Nowy wątek
2015-08-27 14:56

Rejestracja: 12 lat temu

Ostatnio: 3 lata temu

0

Witam!
Mam następujący fragment kodu:

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    QFrame *frm = new QFrame(this);
    frm->setGeometry(this->geometry());

    QPushButton *btn1 = new QPushButton("Btn1", frm);
    btn1->setGeometry(10, 10, 100, 25);

    QPushButton *btn2 = new QPushButton("Btn2", frm);
    btn2->setGeometry(10, 45, 100, 25);

    {
        QGraphicsBlurEffect *effect = new QGraphicsBlurEffect(frm);
        effect->setBlurRadius(2);
        frm->setGraphicsEffect(effect);
    }

    {
        QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect(btn2);
        effect->setBlurRadius(30);
        effect->setColor(Qt::black);
        effect->setOffset(0,0);
        btn2->setGraphicsEffect(effect);
    }
}

MainWindow::~MainWindow()
{

}

Pod Qt 4.8.6 wszystko jest OK (rys1.png), natomiast pod Qt 5.5.0 btn2 znika (rys2.png). Ewidentnie ma problem z podwójnymi efektami (jeden dla widżetu i jeden dla jego rodzica).

I teraz pytanie: Ja coś skopałem? Czy to może bug w Qt5? A może jest to poprawne zachowanie? Jeśli tak to istnieje jakieś obejście?

Z góry dzięki za wskazówki
Pozdrawiam

Pozostało 580 znaków

2015-08-27 16:34

Rejestracja: 5 lat temu

Ostatnio: 3 lata temu

0

@lukasz1235

Znajdź różnicę między twoim kodem a moim :)

Podpowiedź QGraphicsBlurEffect i QGraphicsDropShadowEffect

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QFrame>
#include <QPushButton>
#include <QGraphicsBlurEffect>
#include <QGraphicsDropShadowEffect>

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

    QFrame *frm = new QFrame(this);
    frm->setGeometry(this->geometry());

    QPushButton *btn1 = new QPushButton("Btn1", frm);
    btn1->setGeometry(10, 10, 100, 25);

    QPushButton *btn2 = new QPushButton("Btn2", frm);
    btn2->setGeometry(10, 45, 100, 25);

    {
        QGraphicsBlurEffect *effect = new QGraphicsBlurEffect(frm);
        effect->setBlurRadius(2);
        btn1->setGraphicsEffect(effect);
    }

    {
        QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect(frm);
        effect->setBlurRadius(30);
        effect->setColor(Qt::black);
        effect->setOffset(0, 0);
        btn2->setGraphicsEffect(effect);
    }
}

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

Pozostało 580 znaków

2015-08-27 16:41

Rejestracja: 12 lat temu

Ostatnio: 3 lata temu

0

No ok, tylko, że twój kod robi coś zupełnie innego. Jeden button dostaje blura, a drugi cień. Mi chodziło o cień dla jednego buttona i blura na CAŁOŚĆ. Popatrz jeszcze raz na pierwszy screenshot.

Pozostało 580 znaków

x
2015-08-27 17:55
x
1

Jak dla mnie wygląda to na jakiś poważny fuckup w Qt; pobawiłem się chwile i wygląda na to, że można dodać efekt dla dziecka, ale wtedy, gdy jest ono do rodzica dodane jako pierwsze (bez sensu, ale tak jest), przykład, gdzie coś działa:

#include "mainwindow.hpp"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QHBoxLayout>
#include <QFrame>
#include <QPushButton>
#include <QGraphicsBlurEffect>
#include <QGraphicsColorizeEffect>
#include <QGraphicsDropShadowEffect>

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

    QPushButton* button1 = new QPushButton("Button1");
    QPushButton* button2 = new QPushButton("Button2");

    setCentralWidget(new QWidget(this));
    centralWidget()->setLayout(new QHBoxLayout);
    centralWidget()->layout()->addWidget(button1);
    centralWidget()->layout()->addWidget(button2);

    QGraphicsDropShadowEffect* shadow = new QGraphicsDropShadowEffect;
    shadow->setBlurRadius(20);
    shadow->setColor(Qt::black);
    shadow->setOffset(0, 0);

    QGraphicsBlurEffect* blur = new QGraphicsBlurEffect;
    blur->setBlurRadius(4);

    centralWidget()->setGraphicsEffect(blur);

#define IWANNA_EFFECTS 1
#ifdef IWANNA_EFFECTS
    // Działa tylko dla pierwszego dodanego buttona do layoutu.
    button1->setGraphicsEffect(shadow);
#else
    button2->setGraphicsEffect(shadow);
#endif
}

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

Zatem odpowiadając na pytanie: tak, można to obejść... Debilnie, ale można.

Pozostało 580 znaków

2015-08-27 19:13

Rejestracja: 12 lat temu

Ostatnio: 3 lata temu

0

Dzięki za odpowiedź. Faktycznie nie za dobrze to wygląda. Zgłosiłem buga, zobaczymy co z tego wyniknie.

Swoją drogą: mógłbyś wrzucić tutaj jakiegoś linka do zgłoszonego buga? - IForgotMyPass 2015-08-28 19:23

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0