Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Модель/Представление _ модель и qcombobox

Автор: abc 16.12.2010, 14:00

Беру из БД часть значений, пихаю их в comboBox, хочу одну строку в боксе пустую, чтобы она была одним из вариантов, как её добавить?

Автор: wiz29 16.12.2010, 14:04

Цитата(abc @ 16.12.2010, 14:00) *
Беру из БД часть значений, пихаю их в comboBox, хочу одну строку в боксе пустую, чтобы она была одним из вариантов, как её добавить?

тогда добавь пустую строку QString(tr("")) на нужную позицию в босксе и все:) void QComboBox::insertItem ( int index, const QString & text, const QVariant & userData = QVariant() )

Автор: abc 16.12.2010, 14:04

поправка: из бд в модель, модель в бокс

Автор: wiz29 16.12.2010, 14:16

Цитата(abc @ 16.12.2010, 14:04) *
поправка: из бд в модель, модель в бокс

ну тогда в модели данных создавай пустое поле...

Автор: vankleef 16.12.2010, 14:16

только добавляй свою строку после того как модель туда запихнул

Автор: abc 16.12.2010, 14:27

QSqlQueryModel * query=new QSqlQueryModel;
query->setQuery(str,db);
comboBox->setModel(query);
qDebug()<<query->insertRow(0); //false

Автор: vankleef 16.12.2010, 22:36

QSqlQueryModel * query=new QSqlQueryModel;
query->setQuery(str,db);
comboBox->setModel(query);
comboBox->insertItem(0,"Еще один элемент в комбобоксе");

Автор: abc 17.12.2010, 12:40

ничего не даёт, так понимаю, что боксу назначена модель, и он не станет отображать прям в него засунутые ячейки

Автор: arial 17.12.2010, 14:17

Создай свою модель и делай там что хочешь.
Примерно так это будет выглядеть:

class MyModel : public QAbstractItemModel
{
    Q_OBJECT
    
public:
    explicit MyModel(QObject *parent = 0);
    ~MyModel();
    
    QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
    QModelIndex parent(const QModelIndex &child) const;

    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    int columnCount(const QModelIndex &parent = QModelIndex()) const;

    inline QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
    {
        // Если запрашивают строку с индексом ноль,
        // возвращаем пустое значение
        if (index.row() == 0) {
            return QVariant();
        }

        // Во всех других случаях возвращаем данные
        // из QSqlQueryModel
        return m_model->data(index.sibling(index.row() - 1, index.column()), role);
    }
    
private:
    QSqlQueryModel *const m_model;
};


Автор: abc 19.12.2010, 16:46

данные из m_model в бокс не попадают
если я правильно понял смысл: в m_model помещаю мой запрос, боксу присваиваю экземпляр MyModel
наследовался от QSqlQueryModel, потому что компилятор, при наследовании от QAbstractItemModel, ругается на все функции, что они абстрактные - что это значит?

Автор: arial 19.12.2010, 17:04

Да, в m_model помещаешь свой запрос. Наследоваться от QSqlQueryModel не надо. Ругается на все функции, потому что они не реализованы. Реализуй их, как в моём примере реализован метод data. Не знаешь, как реализовать - открой исходники той же QSqlQueryModel и посмотри там.
Читай про виртуальные функции, например, http://www.interface.ru/home.asp?artId=5895.

Автор: abc 19.12.2010, 17:27

но если я наследуюсь от qsqlquerymodel смысл же остаётся тот же? почему бы в этом случае функции data не работать по твоему сценарию?

Автор: vankleef 19.12.2010, 17:40

Цитата(abc @ 17.12.2010, 12:40) *
ничего не даёт, так понимаю, что боксу назначена модель, и он не станет отображать прям в него засунутые ячейки


у меня работает, только я использую не querymodel, а TableModel

themeModel=new QSqlTableModel;
themeModel->setTable("themes");
themeModel->select();
    
widget.themecomboBox->setModel(themeModel);
widget.themecomboBox->setModelColumn(themeModel->fieldIndex("name"));
widget.themecomboBox->insertItem(0,QString::fromUtf8("Все вопросы"));
widget.themecomboBox->setCurrentIndex(0);

Автор: abc 19.12.2010, 17:55

с QSqlTableModel действительно работает, а с QSqlQueryModel нет..

Автор: arial 19.12.2010, 18:04

Цитата(abc @ 19.12.2010, 17:27) *
но если я наследуюсь от qsqlquerymodel смысл же остаётся тот же?

Нет ни одной объективной причины наследоваться от QSqlQueryModel. Ты наследуешься от QSqlQueryModel потому что после этого исчезают ошибки при компиляции. Мне это напоминает старый анекдот:
Цитата
- Ты что ищешь?
- Ключи потерял
- А где потерял?
- Вон там
- А почему ищешь здесь?
- Здесь светлее!

Почитай про http://doc.crossplatform.ru/qt/4.7.x/qabstractitemmodel.html там написано про наследование. Если до завтра сам не разберёшься, выложу работающий пример.

Автор: abc 19.12.2010, 21:13

сделал через QSqlTableModel, поставил нужное ограничение с помощью её функции setFilter
vankleef мой герой!
arial, я завтра на работе в книге посмотрю, там должны быть примеры ("Земсков, примеры"), научусь наследоваться от абстрактитем и проверю твой вариант.
если не выйдет, попрошу у тебя помощи, спасибо за поддержку

Автор: arial 20.12.2010, 9:45

В приложении рабочий пример. Выкладываю, как и обещал.

 MyModelExample.zip ( 4.02 килобайт ) : 128
 

Автор: abc 20.12.2010, 13:28

спасибо, arial
return hasIndex(row, column, parent) ? createIndex(row, column, 0) : QModelIndex(); // что означают ? и :


Автор: arial 20.12.2010, 13:41

http://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D1%80%D0%BD%D0%B0%D1%80%D0%BD%D0%B0%D1%8F_%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F_%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F

Автор: abc 20.12.2010, 13:54

понял)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)