crossplatform.ru

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

abc
  опции профиля:
сообщение 16.12.2010, 14:00
Сообщение #1


Участник
**

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

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




Репутация:   4  


Беру из БД часть значений, пихаю их в comboBox, хочу одну строку в боксе пустую, чтобы она была одним из вариантов, как её добавить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 19)
wiz29
  опции профиля:
сообщение 16.12.2010, 14:04
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

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




Репутация:   12  


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

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

Сообщение отредактировал wiz29 - 16.12.2010, 14:05
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 16.12.2010, 14:04
Сообщение #3


Участник
**

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

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




Репутация:   4  


поправка: из бд в модель, модель в бокс
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 16.12.2010, 14:16
Сообщение #4


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

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




Репутация:   12  


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

ну тогда в модели данных создавай пустое поле...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vankleef
  опции профиля:
сообщение 16.12.2010, 14:16
Сообщение #5


Студент
*

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

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




Репутация:   1  


только добавляй свою строку после того как модель туда запихнул
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 16.12.2010, 14:27
Сообщение #6


Участник
**

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

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




Репутация:   4  


QSqlQueryModel * query=new QSqlQueryModel;
query->setQuery(str,db);
comboBox->setModel(query);
qDebug()<<query->insertRow(0); //false
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vankleef
  опции профиля:
сообщение 16.12.2010, 22:36
Сообщение #7


Студент
*

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

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




Репутация:   1  


QSqlQueryModel * query=new QSqlQueryModel;
query->setQuery(str,db);
comboBox->setModel(query);
comboBox->insertItem(0,"Еще один элемент в комбобоксе");
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 17.12.2010, 12:40
Сообщение #8


Участник
**

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

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




Репутация:   4  


ничего не даёт, так понимаю, что боксу назначена модель, и он не станет отображать прям в него засунутые ячейки
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
arial
  опции профиля:
сообщение 17.12.2010, 14:17
Сообщение #9


Студент
*

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

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




Репутация:   0  


Создай свою модель и делай там что хочешь.
Примерно так это будет выглядеть:
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
Сообщение #10


Участник
**

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

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




Репутация:   4  


данные из m_model в бокс не попадают
если я правильно понял смысл: в m_model помещаю мой запрос, боксу присваиваю экземпляр MyModel
наследовался от QSqlQueryModel, потому что компилятор, при наследовании от QAbstractItemModel, ругается на все функции, что они абстрактные - что это значит?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
arial
  опции профиля:
сообщение 19.12.2010, 17:04
Сообщение #11


Студент
*

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

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




Репутация:   0  


Да, в m_model помещаешь свой запрос. Наследоваться от QSqlQueryModel не надо. Ругается на все функции, потому что они не реализованы. Реализуй их, как в моём примере реализован метод data. Не знаешь, как реализовать - открой исходники той же QSqlQueryModel и посмотри там.
Читай про виртуальные функции, например, здесь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 19.12.2010, 17:27
Сообщение #12


Участник
**

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

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




Репутация:   4  


но если я наследуюсь от qsqlquerymodel смысл же остаётся тот же? почему бы в этом случае функции data не работать по твоему сценарию?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vankleef
  опции профиля:
сообщение 19.12.2010, 17:40
Сообщение #13


Студент
*

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

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




Репутация:   1  


Цитата(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
Сообщение #14


Участник
**

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

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




Репутация:   4  


с QSqlTableModel действительно работает, а с QSqlQueryModel нет..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
arial
  опции профиля:
сообщение 19.12.2010, 18:04
Сообщение #15


Студент
*

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

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




Репутация:   0  


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

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

Почитай про QAbstractItemModel там написано про наследование. Если до завтра сам не разберёшься, выложу работающий пример.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 19.12.2010, 21:13
Сообщение #16


Участник
**

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

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




Репутация:   4  


сделал через QSqlTableModel, поставил нужное ограничение с помощью её функции setFilter
vankleef мой герой!
arial, я завтра на работе в книге посмотрю, там должны быть примеры ("Земсков, примеры"), научусь наследоваться от абстрактитем и проверю твой вариант.
если не выйдет, попрошу у тебя помощи, спасибо за поддержку
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
arial
  опции профиля:
сообщение 20.12.2010, 9:45
Сообщение #17


Студент
*

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

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




Репутация:   0  


В приложении рабочий пример. Выкладываю, как и обещал.
Прикрепленные файлы
Прикрепленный файл  MyModelExample.zip ( 4.02 килобайт ) Кол-во скачиваний: 158
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 20.12.2010, 13:28
Сообщение #18


Участник
**

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

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




Репутация:   4  


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

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
arial
  опции профиля:
сообщение 20.12.2010, 13:41
Сообщение #19


Студент
*

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

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




Репутация:   0  


Тернарная операция
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 20.12.2010, 13:54
Сообщение #20


Участник
**

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

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




Репутация:   4  


понял)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 29.6.2025, 21:11