Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прозрачный titlebar у дочернего окна 
:(
    Опции темы
XavierElf
Дата 23.4.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

Репутация: нет
Всего: 1



Вопрос, как можно это реализовать? С помощью наследования от QWindowStyle добился чтобы вместо стандартного заголовка дочернего окна выводился мой, однако проблема в том, что у меня заголовок не прямоугольной формы. Поэтому через "пустые" места просвечивает стандартный фон заголовка. Ни регионы (clipRegion), ни установка кисти фона в transparent, ни установка атрибута окна WA_NoSystemBackground не помогают. Что посоветуете? Код следующий:
Код

void CustomStyle::drawComplexControl(ComplexControl control,
                                     const QStyleOptionComplex * option,
                                     QPainter * painter,
                                     const QWidget * widget) const
{
    QRect rect(0,0,20,46);
    switch (control)
    {
#ifndef QT_NO_TITLEBAR

    case CC_TitleBar:
        painter->drawImage(0, 0, QImage(":/titlebar_left.png"), 0, 0, 20, 46);
        painter->drawImage(widget->width() / 2 - 60, 0, QImage(":/titlebar_center.png"), 0, 0, 121, 46);
        painter->drawImage(widget->width() - 20, 0, QImage(":/titlebar_right.png"), 0, 0, 20, 46);
        break;
#endif

    default:
        QWindowsStyle::drawComplexControl(control, option, painter, widget);
    }
}

--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
XavierElf
Дата 24.4.2008, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

Репутация: нет
Всего: 1



Проблему решил таким образом:
Наследовался от QMdiSubWindow и переопределил resizeEvent.
Код

void CustomMdiSubWindow::resizeEvent(QResizeEvent* event)
{
    QMdiSubWindow::resizeEvent(event); //вот с этим пунктом не понятно. с ним при ресайзе очень моргает окно. 
    //без него после первого ресайза у окна пропадают места для ресайза мышью(в основном справа), то есть нельзя никак второй и 
    //последующий разы изменить размеры окна.
    QPixmap clipImage(this->size());
    QImage left(":/titlebar_left.png");
    QImage right(":/titlebar_right.png");
    QImage center(":/titlebar_center.png");
    QImage chunk(":/titlebar_chunk.png");
    int left_chunk_width = this->width() / 2 - 78;
    int right_chunk_width = this->width() / 2 - 79;
    QPainter buffer(&clipImage);
    buffer.setBrush(QBrush(QColor(Qt::yellow)));
    buffer.drawRect(-1, -1, this->width() + 1, 46);
    buffer.setBrush(QBrush(QColor(Qt::green)));
    buffer.drawRect(-1, 45, this->width() + 1, this->height() - 46);
    buffer.drawImage(20, 0, chunk.scaled(left_chunk_width, 46), 0, 0, left_chunk_width, 46);
    buffer.drawImage(this->width() - 20 - right_chunk_width, 0, chunk.scaled(right_chunk_width, 46), 0, 0, right_chunk_width, 46);
    buffer.drawImage(0, 0, left, 0, 0, 20, 46);
    buffer.drawImage(this->width() / 2 - 60, 0, center, 0, 0, 121, 46);
    buffer.drawImage(this->width() - 20, 0, right, 0, 0, 20, 46);
    setMask(clipImage.createMaskFromColor(QColor(Qt::yellow),Qt::MaskInColor));
}

Если кто может предложить вариант получше - жду с нетерпением!  smile 
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
Flakes
Дата 7.5.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 7.5.2008

Репутация: нет
Всего: нет



не знаю, оно ли, но я через setWindowFlags(Qt::FramelessWindowHint) отключал внешний фрейм, заголовок с кнопочками, ресайзер в углу, resizeEvent и moveEvent - все переопределял...

а еще можно скрин, что у вас получилось в итоге?

Это сообщение отредактировал(а) Flakes - 7.5.2008, 14:29
PM MAIL   Вверх
XavierElf
Дата 7.5.2008, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

Репутация: нет
Всего: 1



Получилось следующее. Скрин в атаче.


Присоединённый файл ( Кол-во скачиваний: 34 )
Присоединённый файл  Untitled.png 21,67 Kb
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
Flakes
Дата 8.5.2008, 04:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 7.5.2008

Репутация: нет
Всего: нет



ну как бы он не совсем прозрачный все равно )) именно поэтому я избегаю shaped frames, все эти резкие пиксельные переходы на кроях раздражают, пусть лучше будет квадратная рамка. Если вы знакомы как заставить это работать с масками... я буду признателен!
PM MAIL   Вверх
XavierElf
Дата 8.5.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 200
Регистрация: 24.1.2007
Где: г. Тверь

Репутация: нет
Всего: 1



А прозрачность у меня совсем никак не хочет работать. Вроде и расширение композит стоит, а свойство windowOpacity при изменении абсолютно не меняет ничего. ХЗ что можно сделать smile
--------------------
Даешь открытые исходники!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0428 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.