Название: Наложение элементов окна при событии активности
Отправлено: AndreyOnPC от Июль 16, 2013, 14:17
Сделал окно с прозрачным фоном: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ... this->setWindowFlags( Qt::FramelessWindowHint ); this->setAttribute( Qt::WA_TranslucentBackground ); this->setStyleSheet( "background:transparent;");
QPixmap backgroud_img( ":/materials/background.png" );
QImage image(backgroud_img.size(), QImage::Format_ARGB32_Premultiplied); image.fill(Qt::transparent); QPainter p(&image); p.setOpacity(0.35); p.drawPixmap(0, 0, backgroud_img); p.end(); backgroud_img = QPixmap::fromImage(image);
ui->background->setPixmap( backgroud_img ); // background - label элемент
}
Если окно не сворачивать а делать не активным, например нажав на другое окно и затем снова сделать активным, нажав на него или на его иконку в панели задач windows, то прозрачность элементов уменьшается, как будто они накладываются друг на друга. Как я понял, это события: deactivate() activate() Картинка прозрачного фона (http://cs538301.vk.me/u113210872/doc/6f4771ddfac5/background.png) Окно сначала (http://cs537206.vk.me/u113210872/doc/ed1fe6454b21/1.png) Окно после события активности (http://cs537108.vk.me/u113210872/doc/947046781c08/2.png) Ещё одно событие (http://cs537203.vk.me/u113210872/doc/c5663c146f06/3.png) Возможно это происходит и после события неактивности, но я не заметил. Как это можно исправить?
Название: Re: Наложение элементов окна при событии активности
Отправлено: Bepec от Июль 16, 2013, 17:28
Мб создание на одном и том же месте нескольких объектов? Проконтролируйте число их.
Название: Re: Наложение элементов окна при событии активности
Отправлено: AndreyOnPC от Июль 16, 2013, 18:46
Я бы попробовал так сделать, если бы знал. Как это сделать?
Название: Re: Наложение элементов окна при событии активности
Отправлено: Bepec от Июль 16, 2013, 18:50
В деструкторе и конструкторе счётчик статический прибавляйте или убавляйте.
Название: Re: Наложение элементов окна при событии активности
Отправлено: AndreyOnPC от Июль 16, 2013, 19:16
Т.е. в классе этого окна есть статический счётчик? Какое у него имя?
Название: Re: Наложение элементов окна при событии активности
Отправлено: gil9red от Июль 16, 2013, 21:24
Или просто попробуйте в конструкторе и деструкторе писать что то в консоль и Когда объекты будут создаваться и удаляться в консоле подсчитаете сколько появилось новых записей
Название: Re: Наложение элементов окна при событии активности
Отправлено: AndreyOnPC от Июль 16, 2013, 22:12
Во время этих событий ни конструктор, ни диструктор не отвечает. Конструктор только вначале, а диструктор только поле закрыти, логично.
Название: Re: Наложение элементов окна при событии активности
Отправлено: Bepec от Июль 16, 2013, 22:27
дЕструктор. дЕстр!
Что могу сказать - нужно больше кода. Неизвестно что там у вас за многоножка накодена полупрозрачная.
Название: Re: Наложение элементов окна при событии активности
Отправлено: AndreyOnPC от Июль 17, 2013, 00:33
Всё это выглядит таким образом notifywindow.h #ifndef NOTIFYWINDOW_H #define NOTIFYWINDOW_H
#include <QMainWindow> #include <QEvent>
namespace Ui { class NotifyWindow; }
class NotifyWindow : public QMainWindow { Q_OBJECT public: explicit NotifyWindow(QWidget *parent = 0); ~NotifyWindow();
private: Ui::NotifyWindow *ui;
void initWindowGeomery();
};
#endif // NOTIFYWINDOW_H
notifywindow.cpp #include "notifywindow.h" #include "ui_notifywindow.h"
#include <QPainter> #include <QDesktopWidget> #include <QDebug>
void setAlphaPixmap(QPixmap&, double);
NotifyWindow::NotifyWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::NotifyWindow) { ui->setupUi(this);
this->setWindowFlags( Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint ); this->setAttribute( Qt::WA_TranslucentBackground ); this->setStyleSheet( "background:transparent;"); ui->centralWidget->setStyleSheet( "background:transparent;" );
QPixmap backgroud_img( ":/materials/background.png" ); setAlphaPixmap(backgroud_img, 0.35);
ui->background->setPixmap( backgroud_img ); initWindowGeomery();
qDebug() << "created()" << "\n";
}
NotifyWindow::~NotifyWindow() { qDebug() << "deleted()" << "\n"; delete ui; }
//////////////////////////////////////////////////
void NotifyWindow::initWindowGeomery() { int screenSizeX, screenSizeY, appSizeX, appSizeY; QDesktopWidget desk;
appSizeX = ui->background->width(); appSizeY = ui->background->height(); screenSizeX = desk.width(); screenSizeY = desk.height(); this->move( (screenSizeX - appSizeX) - 5, 46 ); }
void setAlphaPixmap(QPixmap &Pixmap, double alpha) { QImage image(Pixmap.size(), QImage::Format_ARGB32_Premultiplied); image.fill(Qt::transparent); QPainter p(&image); p.setOpacity(alpha); p.drawPixmap(0, 0, Pixmap); p.end(); Pixmap = QPixmap::fromImage(image); }
main.cpp #include "notifywindow.h" #include <QApplication>
int main(int argc, char *argv[]) { QApplication a(argc, argv); NotifyWindow w; w.show(); return a.exec(); }
resources.qrc <RCC> <qresource prefix="/"> <file>materials/background.png</file> </qresource> </RCC>
И в notifywindow.ui <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>NotifyWindow</class> <widget class="QMainWindow" name="NotifyWindow"> <property name="windowModality"> <enum>Qt::NonModal</enum> </property> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>292</width> <height>61</height> </rect> </property> <widget class="QWidget" name="centralWidget"> <widget class="QLabel" name="background"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>292</width> <height>61</height> </rect> </property> <property name="lineWidth"> <number>0</number> </property> <property name="text"> <string/> </property> </widget> </widget> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections/> </ui>
Почти ничего нет. Только окно на котором label с фоном. Ну, и соответственно прозрачность.
Название: Re: Наложение элементов окна при событии активности
Отправлено: Bepec от Июль 17, 2013, 07:10
Собрал ради интереса ваш проект - полностью корректное поведение.
Вам остаётся только добавить версию Qt и копать дальше - мб это бага, мб что-то ещё. (к примеру у вас рабочий стол не перерисовывается :D )
|