LINUX.ORG.RU

Qt4 наложение прозрачного виджета


0

0

Необходимо наложить прозрачный виджет на другой.

Наложение я реализовал так:

QFrame *parent = new QFrame();
QWidget *child1= new QWidget();
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(child1);
parent->setLayout(layout);
// виджет, который должен быть прозрачным, и который должен наложиться на child1
QWidget *child2 = new QWidget(parent);
child2->resize(...); // в ручную задаю размер и позицию
child2->move(...);

Теперь вопрос: правильно ли сделал наложение одного виджета на другой, или можно сделать более оптимальным способом? Вопрос два: каким образом сделать сделать child2 полностью прозрачным (чтобы все элементы child2 были видны)?


easter egg в свой проект добавляешь?)
похвально

xydo ★★
()
Ответ на: комментарий от nanoo_linux

не получается, эффекта ноль.

В родительском виджете установлены собственные стили, и при установке setWindowOpacity, эффекта ноль, но бэкграунд накладывающего виджета всегда того цвета, что и бэкграунд родительского виджета (несмотря на то, что через setStyleSheets ставится свой). Это собственно один из косяков. Поэтому и спросил правильно ли я сделал «наложение».

uKCuH
() автор топика
Ответ на: комментарий от UVV

Дело в том что с основным виджетом (child1 к примеру) работает сторонняя библиотека, которая, получая хэндлер окна, рисует в него и обрабатывает события клавиатуры и мыши, не отдавая их затем родительскому окну. Т.е. получается что я не могу обработать эвенты мыши в этом окне. Вот и появилась идея «наложить» на него другой виджет полностью прозрачный, который и будет обрабатывать эвенты мыши. А пользователь будет считать, что перед ним только один виджет )

uKCuH
() автор топика
Ответ на: комментарий от uKCuH

Мне кажется проще было бы поставиль фильтр на это самое окно:

bool MyWindow::eventFilter( QObject * o, QEvent * e )
{
  if ( o == child1 )
  {
    switch ( e->type() )
    {
    case QEvent::MouseMove:
    case QEvent::MouseButtonPress:
    case QEvent::MouseButtonRelease:
    case QEvent::KeyPress:
    case QEvent::KeyRelease:
      if ( processThisEventByMySelf( e ) )
        return true;
    }
  }

  return ParentClass::eventFilter( o, e );
}
Dendy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.