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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Редактируемый QComboBox без кнопки со стрелкой  (Прочитано 11023 раз)
radislav72
Гость
« : Сентябрь 08, 2010, 08:13 »

Возникла специфическая задача, и не знаю можно ли так сделать.

Можно ли программно изменять комбобокс так, чтобы убирать/ снова включать отображение стрелки, по которой раскрывается выпадающий список. Комбобокс редактируемый, т.е. он временно превращается по функциональности в QLineEdit.

Если так нельзя, то придется создавать два виджета: комбобокс и лайнедит. А хотелось бы спростить и пользовать один и тот же виджет.
Записан
crossly
Гость
« Ответ #1 : Сентябрь 08, 2010, 09:03 »

а для чего  убирать стрелку??
Записан
SABROG
Гость
« Ответ #2 : Сентябрь 08, 2010, 09:12 »

Я иногда вызываю список через Alt+↓ Если заблокировать только кнопку, то это ничего не даст. Вообще в QComboBox стрелка не является полноценной кнопкой, она рисуется. Стандартных средств скрыть стрелку нет.
Записан
radislav72
Гость
« Ответ #3 : Сентябрь 08, 2010, 09:44 »

а для чего  убирать стрелку??
Ох... говорю: специфическое задание Улыбающийся Есть в форме настраиваемые поля, которые могут иметь, а могут не иметь набор неких (тоже настраиваемых) стандартных значений. Посему при отображении формы динамически создается набор виджетов-редактируемых комбобоксов, которые в списке содержат стандартные значения. И все вроде-бы хорошо, но при отсутствии станд. значений стрелка есть, а списка, соответственно, нет. Для меня в етом проблемы нет и небыло, думал что все ОК, отработано, проверено... Но для не очень умных теток, работающих с прогой оказалось, тут зарыта проблема: они видят стрелку комбобокса, сразу срабатывает инстинкт, и они начинают жать на нее... Но списка-то нет, и он не открывается, что бросает упомянутых теток в ступор, и они начинают звонить в службу поддержки: "программа не работает"...

Я иногда вызываю список через Alt+↓ Если заблокировать только кнопку, то это ничего не даст. Вообще в QComboBox стрелка не является полноценной кнопкой, она рисуется. Стандартных средств скрыть стрелку нет.
Спасибо за ответ, так и думал. Придется генерить не одни комбобоксы, а комбобоксы с лайнедитами
Записан
merke
Гость
« Ответ #4 : Сентябрь 08, 2010, 10:20 »

Воткни QLineEdit и когда тебе нужно показывай QListWidget. Думаю ты мою идею понял? будет тебе свой личный комбобокс без стрелочки.
Записан
SABROG
Гость
« Ответ #5 : Сентябрь 08, 2010, 11:18 »

По-моему достаточно добавить элемент в список с названием типа "Нет стандартных значений" и сделать его не выбираемым. При открытии будут сразу понимать.
Записан
radislav72
Гость
« Ответ #6 : Сентябрь 08, 2010, 13:04 »

По-моему достаточно добавить элемент в список с названием типа "Нет стандартных значений" и сделать его не выбираемым. При открытии будут сразу понимать.
Идея с елементом "Нет стандартных значений" мне тоже пришла в голову, но если сделать его не выбираемым, то будет несравненно лучше.

Только подскажите еще пожалуйста как ето сделать (то есть сделать item в QComboBox не выбираемым), желательно микропример.
« Последнее редактирование: Сентябрь 08, 2010, 13:06 от radislav72 » Записан
radislav72
Гость
« Ответ #7 : Сентябрь 08, 2010, 19:40 »

Получилось сделать non-select item в комбобоксе через класс, производный от QStandardItemModel
Файл .h
Код:
#ifndef DISABLEITEM_MODEL_H
#define DISABLEITEM_MODEL_H

#include <QStandardItemModel>

class DisableItemModel : public QStandardItemModel
{
public:
    DisableItemModel(QObject *parent = 0);
    Qt::ItemFlags flags(const QModelIndex & index) const;   
};

#endif

Файл .cpp
Код:
#include "disableitemmodel.h"

DisableItemModel::DisableItemModel(QObject *parent) : QStandardItemModel(parent)
{

}

Qt::ItemFlags DisableItemModel::flags(const QModelIndex & index) const
{
    Qt::ItemFlags flags = QStandardItemModel::flags(index);
    if (!index.isValid()) return flags;
    QString value = index.data(Qt::UserRole).toString();
    if (value == "disable")
    {
        flags &= ~Qt::ItemIsSelectable;
        flags &= ~Qt::ItemIsEnabled;
    }
    return flags;
}

Соответственно, использование:
Код:
    ui->comboBox->setModel(new DisableItemModel());
    ui->comboBox->addItem(tr("Значения по умолчанию отсутствуют"));
    ui->comboBox->setItemData(0, "disable");
    ui->comboBox->lineEdit()->setText("");

Может, не лучший способ... Новичок я в QT Улыбающийся Если у кого есть предложения по улучшению и желание ими поделиться, буду рад услышать
Записан
Marat(Qt)
Гость
« Ответ #8 : Сентябрь 09, 2010, 12:08 »

Если не ошибаюсь, вид и размер кнопки комбобокса задается через css, как насчет того чтобы занулить ее ширину?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #9 : Сентябрь 09, 2010, 12:39 »

Цитировать
Если не ошибаюсь, вид и размер кнопки комбобокса задается через css, как насчет того чтобы занулить ее ширину?
Имхо, не получится. Единственное, что мне удалось добиться через css - так это узкую кнопку без стрелки.
Записан

Qt 5.11/4.8.7 (X11/Win)
Marat(Qt)
Гость
« Ответ #10 : Сентябрь 09, 2010, 13:00 »

Цитировать
Если не ошибаюсь, вид и размер кнопки комбобокса задается через css, как насчет того чтобы занулить ее ширину?
Имхо, не получится. Единственное, что мне удалось добиться через css - так это узкую кнопку без стрелки.
Код:
QComboBox {
     border: 1px solid gray;
     border-radius: 3px;
     padding: 1px 1px 1px 1px;
     min-width: 6em;
 }

 QComboBox::drop-down {
     width: 0px;
     border-left-width: 0px;
 }
Ваше имхо далеко от истины
« Последнее редактирование: Сентябрь 09, 2010, 13:09 от Marat(Qt) » Записан
radislav72
Гость
« Ответ #11 : Сентябрь 10, 2010, 07:11 »

Цитата: Marat(Qt)
QComboBox {
     border: 1px solid gray;
     ..............................
Очень хорошее решение, работает: из комбобокса получается настоящий лайнедит.

Большое спасибо всем за дельные советы!
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #12 : Сентябрь 10, 2010, 10:43 »

Цитировать
Ваше имхо далеко от истины
Может быть. Но проблема в том, что вы таким образом как бы "ломаете" текущий стиль для QLineEdit.
Т.е. такой модифицированный combobox  не выглядит так же как рядом стоящие QLineEdit.
Записан

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


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