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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отрисовать много цветных кнопок  (Прочитано 4610 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« : Января 25, 2012, 10:45 »

Стоит задача - нарисовать по вертикали много кнопок, как в вертикал лэйауте, но те кнопки, к-ые не влезают по высоте, должны вылезать за край виджета; скролл не нужен. Типа стека кнопок - при нажатии верхней она исчезает и кнопки подвигаются вверх на одну. Щаз реализовано через скролларею с лэйаутом, но тк кнопок архи много, все безбожно тормозит.

Хотелось бы отрисовать эти кнопки руками в пейнт эвенте. Но вот незадача - я не могу нарисовать Flat кнопку с бэкграунд цветом. Код рисования взят один в один из QPushButton. Если у давибатона установить флэт, то он рисует фон с ролью палитры Button. У меня же это не происходит. ЧЯДНТ?
Код:
#include <QWidget>
#include <QPaintEvent>
#include <QStylePainter>
#include <QStyleOptionButton>

class Widget : public QWidget
{
public:
    Widget(QWidget *parent = 0) : QWidget(parent) {}

    void paintEvent(QPaintEvent *e);
};

void Widget::paintEvent(QPaintEvent *e)
{
    QWidget::paintEvent(e);
    QStylePainter p(this);
    QStyleOptionButton *option = new QStyleOptionButton;
    option->initFrom(this);
    option->features = QStyleOptionButton::None;
//    if (d->flat)
        option->features |= QStyleOptionButton::Flat;
    option->text = "d->text";
    p.drawControl(QStyle::CE_PushButton, *option);
    delete option;
}

// установка палитры:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
   
    Widget *widget = new Widget;
    QPalette pal = widget->palette();
    pal.setColor(QPalette::Button, Qt::red);
    widget->setPalette(pal);
    widget->setAutoFillBackground(true);
    widget->show();

    return a.exec();
}
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5877


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Января 25, 2012, 10:50 »

А если хайдить ненужные?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Января 25, 2012, 10:57 »

Там релайаут тормозит, не поможет.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5877


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Января 25, 2012, 11:00 »

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

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Января 25, 2012, 11:20 »

Это поможет, но все равно туева хуча лишних объектов получается.
Записан
Bepec
Гость
« Ответ #5 : Января 26, 2012, 06:59 »

А не проще тебе тогда сделать Model-View с кнопачобуками? Сразу куча вопросов отпадет.
Записан
Akon
Гость
« Ответ #6 : Января 26, 2012, 09:47 »

Навскидку, м.б.
pal.setColor(QPalette::Background, Qt::red);  // вместо pal.setColor(QPalette::Button, Qt::red);

Цитировать
тк кнопок архи много, все безбожно тормозит
Возможно, имеет смысл следующее: иметь архи большой список команд и только несколько фиксированных (видимых) кнопок. При продвижении команд просто менять свойства кнопок. Т.е. имеем как бы вьюпорт в списке команд.
« Последнее редактирование: Января 26, 2012, 09:57 от Akon » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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