Hi there and happy easter,
I've the follwing issues:
I made a prog, where there are some labels with drop shadow effect, wich is calculatet relative to the mouse cursor position. (As is the cursor is a light source, it's like in the "Populous 3" menu.
So far it's working, BUT:
Even though I've activated the mousetracking property on every element, when I hover over one of the labels, the effect stops to work, it does only work outside the labels.
And another strange issue is:
Sometimes the hole gui freezes and the output says:
QPainter::begin: Paint device returned engine
== 0, type
: 3 QPainter::setRenderHint: Painter must be active to set rendering hints
QPainter::end: Painter not active, aborted
QPainter::begin: Paint device returned engine == 0, type: 3
QPainter::scale: Painter not active
QPainter::setRenderHint: Painter must be active to set rendering hints
QPainter::end: Painter not active, aborted
To copy to clipboard, switch view to plain text mode
Then for some short time, it's working again, but next, the shadow completely disappears, and the GUI freezes totally.
And the really strange thing is, that this issue is not there when I run the prog with the debugger! oO
I'm really stuck on this and haven't any clue where the bug might be.
I'm using Qt 5.8.0 64bit on openSUSE 42.1
This is the code:
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
{
Q_OBJECT
public:
explicit MainWindow
(QWidget *parent
= 0);
~MainWindow();
private slots:
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
void mouseMoveEvent(QMouseEvent *event);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
To copy to clipboard, switch view to plain text mode
main.cpp:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
MainWindow w;
w.show();
return a.exec();
}
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
To copy to clipboard, switch view to plain text mode
mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGraphicsDropShadowEffect>
#include <QDebug>
#include <QMouseEvent>
MainWindow
::MainWindow(QWidget *parent
) : ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setMouseTracking(true);
ui->label->setMouseTracking(true);
ui->label_2->setMouseTracking(true);
ui->label_3->setMouseTracking(true);
ui->label_4->setMouseTracking(true);
ui->widget->setMouseTracking(true);
ui->centralWidget->setMouseTracking(true);
}
MainWindow::~MainWindow()
{
delete ui;
}
this->repaint();
QGraphicsDropShadowEffect * dse = new QGraphicsDropShadowEffect();
dse->setBlurRadius(8);
dse
->setColor
(QColor(0,
0,
0,
180));
QGraphicsDropShadowEffect * dse2 = new QGraphicsDropShadowEffect();
dse2->setBlurRadius(8);
dse2
->setColor
(QColor(0,
0,
0,
180));
QGraphicsDropShadowEffect * dse3 = new QGraphicsDropShadowEffect();
dse3->setBlurRadius(8);
dse3
->setColor
(QColor(0,
0,
0,
180));
QGraphicsDropShadowEffect * dse4 = new QGraphicsDropShadowEffect();
dse4->setBlurRadius(8);
dse4
->setColor
(QColor(0,
0,
0,
180));
int centralX = ui->centralWidget->width()/2;
int centralY = ui->centralWidget->height()/2;
int off1x;
int off1y;
if (event->pos().x() > centralX) {
off1x = centralX - event->pos().x();
//qDebug() << off1x;
}
else if (event->pos().x() < centralX) {
off1x = (event->pos().x() - centralX)*-1;
}
if (event->pos().y() > centralY) {
off1y = centralY - event->pos().y();
}
else if (event->pos().y() < centralY) {
off1y = (event->pos().y() - centralY)*-1;
}
dse->setOffset((off1x+(ui->label->x()/4))/20,(off1y+(ui->label->y()/4))/20);
dse2->setOffset((off1x+(ui->label_2->x()/4))/20,(off1y+(ui->label_2->y()/4))/20);
dse3->setOffset((off1x+(ui->label_3->x()/4))/20,(off1y+(ui->label_3->y()/4))/20);
dse4->setOffset((off1x+(ui->label_3->x()/4))/20,(off1y+(ui->label_4->y()/4))/20);
ui->label->setGraphicsEffect(dse);
ui->label_2->setGraphicsEffect(dse2);
ui->label_3->setGraphicsEffect(dse3);
ui->label_4->setGraphicsEffect(dse4);
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGraphicsDropShadowEffect>
#include <QDebug>
#include <QMouseEvent>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setMouseTracking(true);
ui->label->setMouseTracking(true);
ui->label_2->setMouseTracking(true);
ui->label_3->setMouseTracking(true);
ui->label_4->setMouseTracking(true);
ui->widget->setMouseTracking(true);
ui->centralWidget->setMouseTracking(true);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::mouseMoveEvent(QMouseEvent *event){
this->repaint();
QGraphicsDropShadowEffect * dse = new QGraphicsDropShadowEffect();
dse->setBlurRadius(8);
dse->setColor(QColor(0,0,0,180));
QGraphicsDropShadowEffect * dse2 = new QGraphicsDropShadowEffect();
dse2->setBlurRadius(8);
dse2->setColor(QColor(0,0,0,180));
QGraphicsDropShadowEffect * dse3 = new QGraphicsDropShadowEffect();
dse3->setBlurRadius(8);
dse3->setColor(QColor(0,0,0,180));
QGraphicsDropShadowEffect * dse4 = new QGraphicsDropShadowEffect();
dse4->setBlurRadius(8);
dse4->setColor(QColor(0,0,0,180));
int centralX = ui->centralWidget->width()/2;
int centralY = ui->centralWidget->height()/2;
int off1x;
int off1y;
if (event->pos().x() > centralX) {
off1x = centralX - event->pos().x();
//qDebug() << off1x;
}
else if (event->pos().x() < centralX) {
off1x = (event->pos().x() - centralX)*-1;
}
if (event->pos().y() > centralY) {
off1y = centralY - event->pos().y();
}
else if (event->pos().y() < centralY) {
off1y = (event->pos().y() - centralY)*-1;
}
dse->setOffset((off1x+(ui->label->x()/4))/20,(off1y+(ui->label->y()/4))/20);
dse2->setOffset((off1x+(ui->label_2->x()/4))/20,(off1y+(ui->label_2->y()/4))/20);
dse3->setOffset((off1x+(ui->label_3->x()/4))/20,(off1y+(ui->label_3->y()/4))/20);
dse4->setOffset((off1x+(ui->label_3->x()/4))/20,(off1y+(ui->label_4->y()/4))/20);
ui->label->setGraphicsEffect(dse);
ui->label_2->setGraphicsEffect(dse2);
ui->label_3->setGraphicsEffect(dse3);
ui->label_4->setGraphicsEffect(dse4);
}
To copy to clipboard, switch view to plain text mode
I would appreciate any help!
Bookmarks