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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Свой заголовок окна и прозрачность.  (Прочитано 14564 раз)
leonike
Гость
« Ответ #15 : Апрель 29, 2011, 00:15 »

кажется, нашел такой флаг - Qt::Drawer
Записан
SeverusSnape
Гость
« Ответ #16 : Апрель 29, 2011, 00:25 »

Покажите кусок кода, тогда проще будет разбираться
Записан
leonike
Гость
« Ответ #17 : Апрель 29, 2011, 00:44 »

Покажите кусок кода, тогда проще будет разбираться
да все работает, покажу завтра, сегодня уже отрубаюсь.

проблема в том, что приведенный тобой пример, как вывести прозрачную иконку прекрасно работает в Linux, но не работает в Windows, вместо прозрачности рисуется фон.
Записан
SeverusSnape
Гость
« Ответ #18 : Апрель 29, 2011, 07:25 »

Не верю, так как сам вообще-то писал программу под вин. Опровержение могу выложить в виде скриншота
Записан
SeverusSnape
Гость
« Ответ #19 : Апрель 29, 2011, 07:55 »

Вот еще я писал о классе Pretty OSD из программы Clementine - http://slow-tone.blogspot.com/2011/04/qt-pretty-osd.html ? скриншот прилагается
Записан
leonike
Гость
« Ответ #20 : Апрель 29, 2011, 08:55 »

titlebar.h:
Код:
#ifndef TITLEBAR_H
#define TITLEBAR_H

#include <QtGui/QLabel>

QT_BEGIN_NAMESPACE
class QPushButton;
class QPixmap;
class QPoint;
QT_END_NAMESPACE

class TitleBar : public QLabel
{
    Q_OBJECT

private:
    QPushButton* _minimizeButton, * _closeButton;
    QPixmap _titleBarPixmap;

    QPoint startPos;

    bool _isPressed;

    QWidget* contentWidget;

protected:
    void mousePressEvent(QMouseEvent* );
    void mouseReleaseEvent(QMouseEvent* );
    void mouseMoveEvent(QMouseEvent* );

public:
    TitleBar(QWidget * contentWidget);
    ~TitleBar();

public slots:
    void show();
    void move(int x, int y);
    void close();
    void showMinimized();
};

#endif // TITLEBAR_H

titlebar.cpp:
Код:
#include "titlebar.h"

QT_BEGIN_HEADER
#include <QPushButton>
#include <QPainter>
#include <QImage>
#include <QHBoxLayout>
#include <QMouseEvent>
#include <QPoint>
#include <QApplication>
#include <QPixmap>
#include <QBitmap>
#include <QShowEvent>
QT_END_HEADER

TitleBar::TitleBar(QWidget* contentWidget) :
      _titleBarPixmap(":/images/title_bar.png")
{
    _isPressed = false;

    _closeButton = new QPushButton;
    _minimizeButton = new QPushButton;

    QString qss = "";

    qss.append("QPushButton { border: none; background-image: url(:images/button/window/line.png); background-position: center center; background-repeat: none; height: 16px; width: 16px; }");
    qss.append("QPushButton:hover { border: none; background-image: url(:images/button/window/line_hover.png); background-position: center center; background-repeat: none; height: 16px; width: 16px; }");
    qss.append("QPushButton:pressed { border: none; background-image: url(:images/button/window/line_active.png); background-position: center center; background-repeat: none; height: 16px; width: 16px; }");

    _minimizeButton->setStyleSheet(qss);

    qss = "";
    qss.append("QPushButton { border: none; background-image: url(:images/button/window/close.png); background-position: center center; background-repeat: none; height: 16px; width: 16px; }");
    qss.append("QPushButton:hover { border: none; background-image: url(:images/button/window/close_hover.png); background-position: center center; background-repeat: none; height: 16px; width: 16px; }");
    qss.append("QPushButton:pressed { border: none; background-image: url(:images/button/window/close_active.png); background-position: center center; background-repeat: none; height: 16px; width: 16px; }");

    _closeButton->setStyleSheet(qss);

    QHBoxLayout* layout = new QHBoxLayout;
    layout->addStretch();
    layout->addWidget(_minimizeButton);
    layout->addWidget(_closeButton);
    layout->addSpacing(10);

    setLayout(layout);

    setFixedHeight(48);
    setFixedWidth(368);

    this->contentWidget = contentWidget;
    this->contentWidget->setWindowFlags(Qt::FramelessWindowHint | Qt::Drawer);

    connect(_closeButton, SIGNAL(clicked()), this, SLOT(close()));
    connect(_minimizeButton, SIGNAL(clicked()), this, SLOT(showMinimized()));

    setPixmap(_titleBarPixmap);
    setMask(_titleBarPixmap.mask());
}

TitleBar::~TitleBar()
{

}

void TitleBar::mousePressEvent(QMouseEvent* event)
{
    if (event->button() == Qt::LeftButton) {
        _isPressed = true;
        startPos = event->pos();
    }
}

void TitleBar::mouseReleaseEvent(QMouseEvent* event)
{
    if(event->button() == Qt::LeftButton) {
        _isPressed = false;
    }
}

void TitleBar::mouseMoveEvent(QMouseEvent* event)
{
    if (_isPressed) {
        move(event->globalX() - startPos.x(), event->globalY() - startPos.y());
    }
}

void TitleBar::show()
{
    QWidget::show();
    contentWidget->show();
    contentWidget->move(x(), y() + height());
}

void TitleBar::move(int x, int y)
{
    QWidget::move(x, y);
    contentWidget->move(x, y + height());
}

void TitleBar::close()
{
    QWidget::close();
    contentWidget->close();
}

void TitleBar::showMinimized()
{
    QWidget::showMinimized();
}

Qt 4.7.2
В Linux все работает почти идеально. В Win вместо прозрачного фона отображается системный цвет и после сворачивания окна разворачивается только заголовок, после переключения с окна приложения на окно любой другой программы и обратно остается заголовок, а contentWidget делает hide, в Linux в таком случае contentWidget возвращается на место
« Последнее редактирование: Апрель 29, 2011, 09:49 от leonike » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Апрель 29, 2011, 10:29 »

[/оффтор]

У меня иногда возникают иногда "позывы" сделать в UI что-нибудь "эдакое" (да и у других наверное тоже). Я прекрасно понимаю что это будет "заброшено и забыто" (когда первая волна энтузиазма пойдет и надо будет вернуться к текучке). В таких случаях может стоит подумать: а дизайнер ли я? Ну закруглю я титул, дальше что? Смогу ли я подобрать цвета, стили контролов и многое др. так чтобы было не только "оригинально" но и другим нравилось? Или просто так, ну делаю пока мне это интересно Улыбающийся Такой взгляд помогает сэкономить немало времени
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #22 : Апрель 29, 2011, 10:45 »

2 Igors :
+1
Мало того, частенько наступает момент, когда всё это начинает безбожно глючить.
Имхо, коли уж очень хочется "поизвращаться" над видом, то нужно иметь опциональный переключатель к стандартному виду.
Записан

Qt 5.11/4.8.7 (X11/Win)
SeverusSnape
Гость
« Ответ #23 : Апрель 29, 2011, 11:07 »

А почему вы не рисуете этот titleBar на самом contentWidget? Меньше проблем было бы
Записан
leonike
Гость
« Ответ #24 : Апрель 29, 2011, 15:36 »

2 Igors :
+1
Мало того, частенько наступает момент, когда всё это начинает безбожно глючить.
Имхо, коли уж очень хочется "поизвращаться" над видом, то нужно иметь опциональный переключатель к стандартному виду.

да я сам считаю, что нужно, чтобы программа вписывалась в настроенное окружение, что особенно просто и удобно реализована в различных de Linux, где просто нужно настроить стиль gtk, Qt

но заказчик хочет дизайн, который сделали его дизайнеры

А почему вы не рисуете этот titleBar на самом contentWidget? Меньше проблем было бы

хотел сначала реализовать так, вечером попробую, как вы сказали, мб что-то получится
Записан
SeverusSnape
Гость
« Ответ #25 : Апрель 29, 2011, 16:06 »

И посмотрите все-таки код pretty osd из ответов выше.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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