Russian Qt Forum

Qt => Вопросы новичков => Тема начата: AndreyOnPC от Июль 16, 2013, 14:17



Название: Наложение элементов окна при событии активности
Отправлено: 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
Или просто попробуйте в конструкторе и деструкторе писать что то в консоль
Код:
qDebug() << "created"
и
Код:
qDebug() << "deleted"
Когда объекты будут создаваться и удаляться в консоле подсчитаете сколько появилось новых записей


Название: 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 )