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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QComboBox. Добавить свою кнопку.  (Прочитано 12846 раз)
neversleep
Гость
« : Февраль 17, 2012, 17:21 »

Как добавить свою кнопку рядом с кнопкой "arrow button" QComboBox`а? Скрин:

« Последнее редактирование: Февраль 19, 2012, 08:14 от neversleep » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Февраль 17, 2012, 17:30 »

Чтобы выглядело как единое целое просто не сделаешь, т.к. придётся очень сильно залезать в кишки CB.
Записан

Qt 5.11/4.8.7 (X11/Win)
sudo
Гость
« Ответ #2 : Февраль 17, 2012, 17:40 »

Да, можно. Делаешь виджет, на котором будет комбо и твои кнопки. Потом кладёшь на него css-стиль через setStyleSheet, который уберёт промежутки между виджетами. При необходимости добавляешь стили на кнопки по вкусу и должно работать

Qt Style Sheets в Ассистенте
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Февраль 17, 2012, 18:05 »

sudo, интересно как ты стилем сделаешь общую рамку и hover-подсветку на дополнительных кнопках?
Записан

Qt 5.11/4.8.7 (X11/Win)
sudo
Гость
« Ответ #4 : Февраль 17, 2012, 18:08 »

Если полностью убрать отступы, рамка будет выглядеть общей, а насчёт подсветки - это необходимо уже смотреть, как конечный результат должен себя вести. Например, можно отловить событие mouseOver пардон, mouseMove
« Последнее редактирование: Февраль 17, 2012, 18:10 от sudo » Записан
neversleep
Гость
« Ответ #5 : Февраль 17, 2012, 22:08 »

Пока не проверял вариант с Qt Style Sheets, но думаю что рамка будет выглядеть общей только в классическом стиле(в винде, как будет в других ос - не знаю). Если со стилями не получится попытаюсь нарисовать это всё вручную(а там и выясню, стоит ли овчинка выделки Улыбающийся ) Спасибо за совет. Тема открыта.
Записан
neversleep
Гость
« Ответ #6 : Февраль 18, 2012, 11:45 »

Забил и сделал по простому, через назначение комбобоксу своего наследника от лайнедита:
(по примеру Lineedit with a clear button)

Код
C++ (Qt)
ButtonLineEdit::ButtonLineEdit(const QString &text, QWidget *parent):
   QLineEdit(text, parent),
   buttonBox(new QWidget(this)),
   button1(new QToolButton(buttonBox)),
   button2(new QToolButton(buttonBox))
{
   buttonBox->setCursor(Qt::ArrowCursor);
 
   const QString buttonStyle = "QToolButton {"\
                                   "border: none;"\
                                   "padding: 0px;}"\
                               "QToolButton:hover {"\
                                   "border-left: 1px solid lightgray;"\
                                   "border-right: 1px solid lightgray;}";
 
   button1->setIcon(QIcon(":/images/tick.png"));
   button1->setStyleSheet(buttonStyle);
 
   button2->setIcon(QIcon(":/images/cross.png"));
   button2->setStyleSheet(buttonStyle);
 
   int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth);
 
   QLayout *layout = new QHBoxLayout(buttonBox);
   layout->setSpacing(1);
   layout->setContentsMargins(0, 0, frameWidth, 0);
   layout->addWidget(button1);
   layout->addWidget(button2);
 
   setStyleSheet(QString("QLineEdit { padding-right: %1px; } ").arg(buttonBox->sizeHint().width() + frameWidth));
}
 

Но есть ещё пара вопросов:


1) Сейчас цвет краёв кнопок при наведении прописан жёстко "lightgray", как получить системный цвет краёв?
2) Не получается изменить цвет фона лайнедита после присвоения его комбобоксу, т.е такой способ уже не прокатывает:
Код
C++ (Qt)
QPalette pal = palette();
pal.setColor(backgroundRole(), Qt::red);
setPalette(pal);
 
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Февраль 18, 2012, 12:48 »

2) а через стиль?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
neversleep
Гость
« Ответ #8 : Февраль 18, 2012, 14:04 »

2) а через стиль?
Странно, через стиль тоже проверял, задавал в конструкторе и он не применялся:
Код
C++ (Qt)
setStyleSheet("QLineEdit {background-color: red;}");
 

А если вне конструктора:
Код
C++ (Qt)
ButtonLineEdit *edit = new ButtonLineEdit(combo);
edit->setStyleSheet("QLineEdit {background-color: red;}");
combo->setLineEdit(edit);
 
То стиль применяется, спасибо.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Февраль 18, 2012, 14:52 »

в конструкторе надо было задавать стиль напрямую (без класса), т.к. при указании класса стиль относится ко всем детям виджета указанного класса
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
neversleep
Гость
« Ответ #10 : Февраль 18, 2012, 15:23 »

setStyleSheet("background-color: red;"); в конструкторе не пашет.

А вообще не вижу логики, почему edit->setStyleSheet("QLineEdit {background-color: red;}"); с указанием класса работает(заметьте не combo, а edit), а тот же стиль в конструкторе не работает?
« Последнее редактирование: Февраль 18, 2012, 16:13 от neversleep » Записан
neversleep
Гость
« Ответ #11 : Февраль 18, 2012, 16:13 »

Сорри, нашёл ошибку:
Код
C++ (Qt)
ButtonLineEdit::ButtonLineEdit(const QString &text, QWidget *parent):
   QLineEdit(text, parent),
   buttonBox(new QWidget(this)),
   button1(new QToolButton(buttonBox)),
   button2(new QToolButton(buttonBox))
{
//1
setStyleSheet("background-color: red;");
...
//2
setStyleSheet(QString("QLineEdit { padding-right: %1px; } ").arg(buttonBox->sizeHint().width() + frameWidth));
}
... Рот на замке
Записан
andrew.k
Гость
« Ответ #12 : Февраль 19, 2012, 15:07 »

в конструкторе надо было задавать стиль напрямую (без класса), т.к. при указании класса стиль относится ко всем детям виджета указанного класса
Разницы нет откуда задавать. Результат должен быть одинаков.
А если задавать без спецификаторов класса, то результат может оказаться не тот, который ожидался.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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