crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> RadioButton в QGroupBox
quarz
  опции профиля:
сообщение 1.12.2010, 0:52
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 49
Регистрация: 3.11.2009
Пользователь №: 1202

Спасибо сказали: 5 раз(а)




Репутация:   0  


Хочу сделать в GroupBox вместо checkbox-а radiobutton. Причем должно работать кроссплатформенно.
Есть одно решение, но оно жутко медленное:
void RadioGroupBox::paintEvent(QPaintEvent *event)
{
    //будет выделяться место под чекбокс, но сам он отрисовываться не будет
    setStyleSheet("QGroupBox::indicator:unchecked{image: url();}QGroupBox::indicator:checked{image: url();}");
    QGroupBox::paintEvent(event);
    setStyleSheet("");

    //рисуем radiobutton
    QStyleOptionGroupBox option;
    QStylePainter paint(this);
        QStyleOptionButton box;
    QRect checkBoxRect = paint.style()->subControlRect(QStyle::CC_GroupBox, &option, QStyle::SC_GroupBoxCheckBox, this);
        box.QStyleOption::operator=(option);
        box.rect = checkBoxRect;
    paint.style()->drawPrimitive(QStyle::PE_IndicatorRadioButton, &box, &paint, this);
}

Настолько медленное, что приложение с тремя такими RadioGroupBox подвисает почти намертво в перерисовках. Видимо, дело в обработке стилей.
Пытался разобраться в тонкостях отрисовки составных контролов, чтобы самому вместо чекбокса рисовать радиобаттон - но не получилось. Нашел drawComplexControl(), но там все отрисовывается через WindowsXPStyle
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Obey-Kun
  опции профиля:
сообщение 1.12.2010, 6:17
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 96
Регистрация: 24.3.2010
Пользователь №: 1556

Спасибо сказали: 3 раз(а)




Репутация:   0  


Вот тут аналогичная проблема и есть решение — http://www.qtcentre.org/threads/23063-Usin...kable-QGroupBox (первый результат в гугле по запросу «qgroupbox checkable radiobutton»)
Может, то решение быстрее?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 1.12.2010, 11:19
Сообщение #3


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(quarz @ 1.12.2010, 2:52) *
Хочу сделать в GroupBox вместо checkbox-а radiobutton.
ничего не понял. для чего вся эта петрушка? Чем обычные радиокнопки помещённые в QGroupBox не устраивают?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 1.12.2010, 11:24
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Что же это за интерфейс такой, что надо выбирать ГРУППУ с помощью переключателя?? Странно, очень странно..
Проще уж тогда поставить картинки переключателя, заместо чекбокса через CSS.
Все равно даже если и перерисовывать,придется описывать поведение такого виджета вручную.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
quarz
  опции профиля:
сообщение 1.12.2010, 13:49
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 49
Регистрация: 3.11.2009
Пользователь №: 1202

Спасибо сказали: 5 раз(а)




Репутация:   0  


Цитата(Obey-Kun @ 1.12.2010, 6:17) *
Вот тут аналогичная проблема и есть решение — http://www.qtcentre.org/threads/23063-Usin...kable-QGroupBox (первый результат в гугле по запросу «qgroupbox checkable radiobutton»)
Может, то решение быстрее?

Спасибо, это то что надо! Тоже искал на qtcentre, видимо не по тем словам )


Цитата(Litkevich Yuriy @ 1.12.2010, 11:19) *
Цитата(quarz @ 1.12.2010, 2:52) *
Хочу сделать в GroupBox вместо checkbox-а radiobutton.
ничего не понял. для чего вся эта петрушка? Чем обычные радиокнопки помещённые в QGroupBox не устраивают?

Radiobutton-ы должны быть у GroupBox-a вместо checkbox-a, когда он checkable

Цитата(Andrewshkovskii @ 1.12.2010, 11:24) *
Что же это за интерфейс такой, что надо выбирать ГРУППУ с помощью переключателя?? Странно, очень странно..
Проще уж тогда поставить картинки переключателя, заместо чекбокса через CSS.
Все равно даже если и перерисовывать,придется описывать поведение такого виджета вручную.

Интерфейс такой: есть 3 группы контролов, активной может быть только одна. На самом деле оч логично и удобно получается.
Картинку переключателя ставить нельзя - не кроссплатформенно.
А поведение пришлось сделать вручную, да.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 1.12.2010, 14:03
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


Нечаянно нажал на "спасибо" :)
Как это, qcss теперь не кросс-платформенно?
Цитата
When a style sheet is active, the QStyle returned by QWidget::style() is a wrapper "style sheet" style, not the platform-specific style. The wrapper style ensures that any active style sheet is respected and otherwise forwards the drawing operations to the underlying, platform-specific style (e.g., QWindowsXPStyle on Windows XP).

Или Вы говорите о поддержки драйверов для изображений ?
Что-то я все равно не понял насчет групп контролов, покажите скриншот, пожалуйста, очень интересно.

Сообщение отредактировал Andrewshkovskii - 1.12.2010, 14:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
quarz
  опции профиля:
сообщение 1.12.2010, 18:51
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 49
Регистрация: 3.11.2009
Пользователь №: 1202

Спасибо сказали: 5 раз(а)




Репутация:   0  


Цитата(Andrewshkovskii @ 1.12.2010, 14:03) *
Как это, qcss теперь не кросс-платформенно?

Кроссплатформенно, но не буду же я картинки для radiobutton под каждую систему искать? А потом в стилях прописывать:
 QGroupBox::indicator:checked {
     image: url(radiobutton_win_checked.png);
}
QGroupBox::indicator:unchecked {
     image: url(radiobutton_win_unchecked.png);
}

и так далее для всех систем. Это не годится =)
А вот, собсно, скрин интерфейса:
Прикрепленное изображение
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrewshkovskii
  опции профиля:
сообщение 1.12.2010, 21:37
Сообщение #8


Активный участник
***

Группа: Участник
Сообщений: 351
Регистрация: 27.12.2008
Пользователь №: 467

Спасибо сказали: 18 раз(а)




Репутация:   1  


А зачем вашему приложению выглядеть по разному в разных системах?что бы было "нативнееько"?:) ну да ладно,это уже флейм пошел.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 2.12.2010, 1:17
Сообщение #9


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(Andrewshkovskii @ 1.12.2010, 21:37) *
А зачем вашему приложению выглядеть по разному в разных системах?что бы было "нативнееько"?
Естественно. Изменение стилей или палитры считаю дурным тоном (если только вы не работаете с проф-м дизайнером ) и всячески стараюсь этого избегать (и других по рукам бью :)). Приложение должно выглядеть нативно на любой платформе и иметь стиль установленный на данный момент пользователем.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
quarz
  опции профиля:
сообщение 9.12.2010, 21:27
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 49
Регистрация: 3.11.2009
Пользователь №: 1202

Спасибо сказали: 5 раз(а)




Репутация:   0  


Под маком обнаружилась проблема - чекбоксы не стираются. В линуксе еще не тестировал.
Вот код, работающий правильно в win и mac
void RadioGroupBox::paintEvent(QPaintEvent *event)
{
    QStylePainter paint( this );
    QStyleOptionGroupBox option;
    initStyleOption( &option );
    // don't remove the original check box control, as we want to keep it as a placeholder
    paint.drawComplexControl( QStyle::CC_GroupBox, option );
    
    // re-use the style option, it contians enough info to make sure the button is correctly checked
    option.rect = style()->subControlRect( QStyle::CC_GroupBox, &option,
    QStyle::SC_GroupBoxCheckBox, this );
    option.rect.moveLeft(option.rect.left() - 1);
    option.rect.setWidth(option.rect.width() + 2);
    option.rect.moveTop(option.rect.top()-1);
    option.rect.setHeight(option.rect.height()+2);
    
    // now erase the checkbox
    paint.save();
    QPalette palette;
    paint.fillRect( option.rect, palette.brush(QPalette::Window));
    paint.restore();
    
    // and replace it with a radio button
    paint.drawPrimitive( QStyle::PE_IndicatorRadioButton, option );
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 21.9.2020, 11:20