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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: TabWidget::cornerButton  (Прочитано 14605 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« : Октябрь 18, 2011, 00:59 »

Задача - сделать просто иконку в углу табвиджета. С ходу повесить кнопку с прозрачным бэкграундом не удалось - под кнопкой виден артефакт в виде не прорисованной области (под ней нет ни таббара, ни текущего виджета)
Как костыль решил так:
Код:
class TabBarButton : public QAbstractButton
{
public:
    TabBarButton() :
        QAbstractButton(),
        hovered(false),
        pressed(false)
    {
    }

    void paintEvent(QPaintEvent *e)
    {
        QPainter p(this);

        QStyleOptionTabBarBaseV2 opt;
        opt.init(this);
        // hardcoded document Mode
        opt.documentMode = true;

        int overlap = style()->pixelMetric(QStyle::PM_TabBarBaseOverlap, &opt, this);
        QRect rect;
        // hardcoded north position
        rect.setRect(0, size().height() - overlap, size().width(), overlap);
        opt.rect = rect;

        qApp->style()->drawPrimitive(QStyle::PE_FrameTabBarBase, &opt, &p, this);

        int w = iconSize().width();
        int h = iconSize().height();
        QIcon::Mode mode = pressed ? QIcon::Selected : QIcon::Normal;

        icon().paint(&p, (width() - w)/2, (height() - h)/2, w, h, Qt::AlignCenter, mode);
    }

    QSize sizeHint() const { return iconSize(); }
    void enterEvent(QEvent *) { hovered = true; update(); }
    void leaveEvent(QEvent *) { hovered = false; update(); }
    void mousePressEvent(QMouseEvent *e) { pressed = true; update(); QAbstractButton::mousePressEvent(e); }
    void mouseReleaseEvent(QMouseEvent *e) { pressed = false; update(); QAbstractButton::mouseReleaseEvent(e); }

private:
    bool hovered;
    bool pressed;
};
Но тут есть проблема - нет возможности отрисовать иконку при ховере (у иконки нет больше модов, наложить полупрозрачную серую маску не получется, почему-то fillRect игнорирует альфаканал). Два вопроса - не извращенец ли я и как сделать отрисовать ховер?
« Последнее редактирование: Октябрь 18, 2011, 13:52 от Авварон » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Октябрь 18, 2011, 07:13 »

Два вопроса - не извращенец ли я и как сделать отрисовать ховер?
Для ховера нужно перегрузить event() и уже в нём следить за QEvent::HoverEnter/QEvent::HoverLeave.
Может проще будет запихнуть QTabBar с одним табом?
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #2 : Октябрь 18, 2011, 07:58 »

А не проще будет создай label  с иконкой и с родителем Tab Widget? правда расчет расположения останется на вас, но все ховеры, евенты будут в вашей же власти.

PS на TabWidgete не проверял, но с modelView'рами работает.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Октябрь 18, 2011, 10:02 »

А не проще будет создай label  с иконкой и с родителем Tab Widget? правда расчет расположения останется на вас, но все ховеры, евенты будут в вашей же власти.
Дык QTabWidget::setCornerWidget() именно для этого и был сделан.
Мало того, если сам будешь позиционировать этот cornerWidget, то QTabWidget растянет QTabBar на всю ширину QTabWidget-а и cornerWidget будет располагаться поверх какого-нибудь таба. Так что, имхо, совсем "не проще")
Записан

Qt 5.11/4.8.7 (X11/Win)
Bepec
Гость
« Ответ #4 : Октябрь 18, 2011, 10:07 »

Не совсем понял, таб виджет будет растягиваться отдельно от label, и даже не будет учитывать его при компоновке. И получится как раз наложение (как мяклей бякнуть по стеклу).

Хотя если велисопед сделан, то у меня вопросов нет, надо на нем ездить Улыбающийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Октябрь 18, 2011, 10:11 »

Не совсем понял, таб виджет будет растягиваться отдельно от label, и даже не будет учитывать его при компоновке. И получится как раз наложение (как мяклей бякнуть по стеклу).
Т.е. label будет поверх таба. И что, это по-твоему нормально?
Записан

Qt 5.11/4.8.7 (X11/Win)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #6 : Октябрь 18, 2011, 13:51 »

Подправил костыль в 1м посте (криво рисовалось на линупсе и винде, нужен и таббаррект и рект)
Так у кого-нибудь есть идеи, как наложить хотя бы серый фильтр поверх кнопки при ховере/нажатии?
У меня не рисуется альфа:(

Пока выглядит как-то так: http://mtgs.clan.su/andromeda/addtab.png (кнопка нажата)
Записан
Bepec
Гость
« Ответ #7 : Октябрь 18, 2011, 14:33 »

а положить css'ку на эту кнопку низя? Или не принимается?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #8 : Октябрь 18, 2011, 14:49 »

Еще раз - проблема не в кнопке, а том, что под ней (серый фон табвиджета, не таббара). QSS модифицирует кнопку, но она все равно смотрится инородно, занимая всю ширину таббара.
Записан
Bepec
Гость
« Ответ #9 : Октябрь 18, 2011, 14:54 »

Ну дык скинь скрины с закрашенной областью кнопки, потому что на той картинке, что ты выложил нигде вот блин не разглядеть. Сколько она занимает, где ее границы и прочая.

Тогда зафигачь ей минимальные значения, у тебя ж кнопка. ты ее размеры спокойно подстраивать можешь.

PS если я не въехал в тему, значит ты дал мало инфы Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Октябрь 18, 2011, 15:01 »

http://mtgs.clan.su/andromeda/assistantbug.png

Левая кнопка выглядит криво, имея рамку слева и снизу и "выползая" на тулбар вверх (а точнее перекрывая верхнюю рамку)
При попытке делать прозрачность получается фигня как с правой кнопкой - серая полоса сверху.
Записан
Bepec
Гость
« Ответ #11 : Октябрь 19, 2011, 08:36 »

Так убери рамку.

И вообще давай по частям (если есть у тебя на это время и желание).

1) у тя фон табвиджета установлен как и какой (чтоб воссоздать условия твои)
2) фон соответственно всего виджета.
3) величина табБара меняется или нет? (в будущем, сейчас, в перспективах)
4) вообще желательно было бы кусок проекта с оформлением, но вырезанной функциональностью.

PS все на усмотрение ваше, бояре
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Октябрь 19, 2011, 09:50 »

Попробуй использовать обычную QToolButton с дефолтной отрисовкой без рамки:
Код
C++ (Qt)
QToolButton::setStyleSheet( "border: 0px" );
Записан

Qt 5.11/4.8.7 (X11/Win)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #13 : Октябрь 19, 2011, 10:07 »

Bepec
все стандартное, простой табвиджет и простой таббар, никаких стилей

Код:
{
...
    newTabButton = new TabBarButton();
    newTabButton->setIcon(QIcon(":/images/icons/addtab.png"));
    newTabButton->setIconSize(QSize(32,32));
    connect(newTabButton, SIGNAL(clicked()), q, SLOT(newTab()));

    tabWidget = new MyTabWidget;
    tabWidget->setDocumentMode(true);
    tabWidget->setMovable(true);
    tabWidget->setTabsClosable(true);
    tabWidget->setUsesScrollButtons(true);
    tabWidget->setCornerWidget(newTabButton);

    q->setCentralWidget(tabWidget);

    connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(onCurrentChanged(int)));
    connect(tabWidget, SIGNAL(tabCloseRequested(int)), q, SLOT(closeTab(int)));
    connect(tabWidget, SIGNAL(tabBarDoubleClicked()), q, SLOT(newTab()));
...
}
MyTabWidget отличается от QTabWidget'a тем, что вешает евент фильтр на таббар и кидает сигнал когда по тому даблкликают.
« Последнее редактирование: Октябрь 19, 2011, 10:08 от Авварон » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #14 : Октябрь 19, 2011, 10:13 »

2 Авварон
попробовал так?
Попробуй использовать обычную QToolButton с дефолтной отрисовкой без рамки:
Код
C++ (Qt)
QToolButton::setStyleSheet( "border: 0px" );
В этом случае кнопка будет прозрачной и без рамки, что имхо, тебе и нужно.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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