Russian Qt Forum
Мая 01, 2025, 21:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QT4.7 (Win) и WA_TranslucentBackground  (Прочитано 5092 раз)
Nine
Гость
« : Сентября 13, 2011, 13:00 »

День добрый, необходим совет по решению проблемы указанной в конце поста.

Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   this->setWindowFlags(Qt::FramelessWindowHint);
   this->setAttribute(Qt::WA_TranslucentBackground);
   this->setAttribute(Qt::WA_NoSystemBackground);
   // ...
}
 

Класс своей кнопки, она меняет изображение в зависимости от состояния. Пока форма у нас перед глазами - всё работает нормально.

.h :

Код
C++ (Qt)
class CImageButton : public QLabel
{
   Q_OBJECT
public:
   CImageButton(QString strBasePicture, QWidget *parent = 0, Qt::WindowFlags f = 0);
   QString m_strBasePicture;
signals:
   void clicked();
protected:
   void enterEvent(QEvent *event);
   void leaveEvent(QEvent *event);
   void mousePressEvent(QMouseEvent *event);
   void mouseReleaseEvent(QMouseEvent *event);
};
 

.cpp :

Код
C++ (Qt)
CImageButton::CImageButton(QString strBasePicture, QWidget *parent, Qt::WindowFlags f)  : QLabel (parent, f)
{
   m_strBasePicture = strBasePicture;
   this->setPixmap(QPixmap(m_strBasePicture+".png"));
}
 
void CImageButton::enterEvent(QEvent *event)
{
  this->setPixmap(QPixmap(m_strBasePicture+"_active.png"));
}
 
void CImageButton::leaveEvent(QEvent *event)
{
  this->setPixmap(QPixmap(m_strBasePicture+".png"));
}
void CImageButton::mousePressEvent(QMouseEvent *event)
{
   this->setPixmap(QPixmap(m_strBasePicture+"_hold.png"));
}
void CImageButton::mouseReleaseEvent(QMouseEvent *event)
{
   emit clicked();
   this->setPixmap(QPixmap(m_strBasePicture+"_active.png"));
}
 

Проблема:
1) Скрываем форму нажатием кнопки "Hide";
В результате вызывается:

Код
C++ (Qt)
void MainWindow::HideButton_clicked()
{
   this->showMinimized();
}
 
2) При нажатии на кнопку открытия окна в таскбаре (условно видим проблему с этого момента), форма возвращается к нам с кнопкой в состоянии "_hold.png" и все переопределенные методы перестают работать для любого экземпляра класса "CImageButton" на ней.
Если закомментировать "this->setAttribute(Qt::WA_TranslucentBackground);", то всё работает как должно, но нет прозрачного фона.
« Последнее редактирование: Сентября 13, 2011, 13:42 от Nine » Записан
soulsaver
Гость
« Ответ #1 : Сентября 13, 2011, 13:08 »

к сожалению давно этим не занимался, но думаю проблема в том что када добавляется альфа канал не идет автоматической перерисовки кнопки, насильно пробовали update делать?
Записан
Nine
Гость
« Ответ #2 : Сентября 13, 2011, 13:20 »

Попробовал "this->update(); myButton->update();" из метода класса "MainWindow, CImageButton" - эффекта нет.
У меня происходит заморозка всего интерфейса использующего класс CImageButton, не только одной кнопки. Ещё кнопка Close, Send и набор Checkbox'ов. При этом "emit clicked();" выполняется и логика приложения никуда не исчезает, только визуальная часть.
Проследил изменения состояний "m_strBasePicture", всё в порядке.
« Последнее редактирование: Сентября 13, 2011, 14:04 от Nine » Записан
qtnoob1k
Гость
« Ответ #3 : Февраля 02, 2012, 00:04 »

Не знаю, актуально ещё или нет, сам с таким сталкнулся, решение такое: переопределить ShowEvent и в него вставить repaint();
https://bugreports.qt-project.org/browse/QTBUG-17548
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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