Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: radislav72 от Сентябрь 08, 2010, 08:13



Название: Редактируемый QComboBox без кнопки со стрелкой
Отправлено: radislav72 от Сентябрь 08, 2010, 08:13
Возникла специфическая задача, и не знаю можно ли так сделать.

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

Если так нельзя, то придется создавать два виджета: комбобокс и лайнедит. А хотелось бы спростить и пользовать один и тот же виджет.


Название: Re: Редактируемый QComboBox без кнопки со стрелкой
Отправлено: crossly от Сентябрь 08, 2010, 09:03
а для чего  убирать стрелку??


Название: Re: Редактируемый QComboBox без кнопки со стрелкой
Отправлено: SABROG от Сентябрь 08, 2010, 09:12
Я иногда вызываю список через Alt+↓ Если заблокировать только кнопку, то это ничего не даст. Вообще в QComboBox стрелка не является полноценной кнопкой, она рисуется. Стандартных средств скрыть стрелку нет.


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

Я иногда вызываю список через Alt+↓ Если заблокировать только кнопку, то это ничего не даст. Вообще в QComboBox стрелка не является полноценной кнопкой, она рисуется. Стандартных средств скрыть стрелку нет.
Спасибо за ответ, так и думал. Придется генерить не одни комбобоксы, а комбобоксы с лайнедитами


Название: Re: Редактируемый QComboBox без кнопки со стрелкой
Отправлено: merke от Сентябрь 08, 2010, 10:20
Воткни QLineEdit и когда тебе нужно показывай QListWidget. Думаю ты мою идею понял? будет тебе свой личный комбобокс без стрелочки.


Название: Re: Редактируемый QComboBox без кнопки со стрелкой
Отправлено: SABROG от Сентябрь 08, 2010, 11:18
По-моему достаточно добавить элемент в список с названием типа "Нет стандартных значений" и сделать его не выбираемым. При открытии будут сразу понимать.


Название: Re: Редактируемый QComboBox без кнопки со стрелкой
Отправлено: radislav72 от Сентябрь 08, 2010, 13:04
По-моему достаточно добавить элемент в список с названием типа "Нет стандартных значений" и сделать его не выбираемым. При открытии будут сразу понимать.
Идея с елементом "Нет стандартных значений" мне тоже пришла в голову, но если сделать его не выбираемым, то будет несравненно лучше.

Только подскажите еще пожалуйста как ето сделать (то есть сделать item в QComboBox не выбираемым), желательно микропример.


Название: Re: Редактируемый QComboBox без кнопки со стрелкой
Отправлено: radislav72 от Сентябрь 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 :) Если у кого есть предложения по улучшению и желание ими поделиться, буду рад услышать


Название: Re: Редактируемый QComboBox без кнопки со стрелкой
Отправлено: Marat(Qt) от Сентябрь 09, 2010, 12:08
Если не ошибаюсь, вид и размер кнопки комбобокса задается через css, как насчет того чтобы занулить ее ширину?


Название: Re: Редактируемый QComboBox без кнопки со стрелкой
Отправлено: GreatSnake от Сентябрь 09, 2010, 12:39
Цитировать
Если не ошибаюсь, вид и размер кнопки комбобокса задается через css, как насчет того чтобы занулить ее ширину?
Имхо, не получится. Единственное, что мне удалось добиться через css - так это узкую кнопку без стрелки.


Название: Re: Редактируемый QComboBox без кнопки со стрелкой
Отправлено: Marat(Qt) от Сентябрь 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;
 }
Ваше имхо далеко от истины


Название: Re: Редактируемый QComboBox без кнопки со стрелкой
Отправлено: radislav72 от Сентябрь 10, 2010, 07:11
Цитата: Marat(Qt)
QComboBox {
     border: 1px solid gray;
     ..............................
Очень хорошее решение, работает: из комбобокса получается настоящий лайнедит.

Большое спасибо всем за дельные советы!


Название: Re: Редактируемый QComboBox без кнопки со стрелкой
Отправлено: GreatSnake от Сентябрь 10, 2010, 10:43
Цитировать
Ваше имхо далеко от истины
Может быть. Но проблема в том, что вы таким образом как бы "ломаете" текущий стиль для QLineEdit.
Т.е. такой модифицированный combobox  не выглядит так же как рядом стоящие QLineEdit.