Russian Qt Forum
Ноябрь 24, 2024, 16:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Наложение элементов окна при событии активности  (Прочитано 4723 раз)
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()

Картинка прозрачного фона


Окно сначала

Окно после события активности

Ещё одно событие


Возможно это происходит и после события неактивности, но я не заметил.
Как это можно исправить?
Записан
Bepec
Гость
« Ответ #1 : Июль 16, 2013, 17:28 »

Мб создание на одном и том же месте нескольких объектов? Проконтролируйте число их.
Записан
AndreyOnPC
Гость
« Ответ #2 : Июль 16, 2013, 18:46 »

Я бы попробовал так сделать, если бы знал. Как это сделать?
Записан
Bepec
Гость
« Ответ #3 : Июль 16, 2013, 18:50 »

В деструкторе  и конструкторе счётчик статический прибавляйте или убавляйте.
Записан
AndreyOnPC
Гость
« Ответ #4 : Июль 16, 2013, 19:16 »

Т.е. в классе этого окна есть статический счётчик? Какое у него имя?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



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

Или просто попробуйте в конструкторе и деструкторе писать что то в консоль
Код:
qDebug() << "created"
и
Код:
qDebug() << "deleted"
Когда объекты будут создаваться и удаляться в консоле подсчитаете сколько появилось новых записей
Записан

AndreyOnPC
Гость
« Ответ #6 : Июль 16, 2013, 22:12 »

Во время этих событий ни конструктор, ни диструктор не отвечает. Конструктор только вначале, а диструктор только поле закрыти, логично.
Записан
Bepec
Гость
« Ответ #7 : Июль 16, 2013, 22:27 »

дЕструктор. дЕстр!

Что могу сказать - нужно больше кода. Неизвестно что там у вас за многоножка накодена полупрозрачная.
Записан
AndreyOnPC
Гость
« Ответ #8 : Июль 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 с фоном.
Ну, и соответственно прозрачность.
Записан
Bepec
Гость
« Ответ #9 : Июль 17, 2013, 07:10 »

Собрал ради интереса ваш проект - полностью корректное поведение.

Вам остаётся только добавить версию Qt и копать дальше - мб это бага, мб что-то ещё. (к примеру у вас рабочий стол не перерисовывается Веселый )
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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