46 / 13 / 3
Регистрация: 29.09.2013
Сообщений: 289
1

Как создать собственную модель?

10.11.2015, 07:49. Показов 1571. Ответов 3
Метки нет (Все метки)

currencymodel.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class CurrencyModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    CurrencyModel(QObject *parent = 0);
 
    void setCurrencyMap(const QMap<QString, double> &map);
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
    QVariant headerData(int section, Qt::Orientation orientation,   int role) const;
 
private:
    QString currencyAt(int offset) const;
 
    QMap<QString, double> currencyMap;
};
currencymodel.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include "currencymodel.h"
 
CurrencyModel::CurrencyModel(QObject *parent) : QAbstractTableModel(parent)
{
}
 
int CurrencyModel::rowCount(const QModelIndex & /* parent */) const
{
    return currencyMap.count();
}
 
int CurrencyModel::columnCount(const QModelIndex & /* parent */) const
{
    return currencyMap.count();
}
 
QVariant CurrencyModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();
 
    if (role == Qt::TextAlignmentRole) {
        return int(Qt::AlignRight | Qt::AlignVCenter);
    } else if (role == Qt::DisplayRole) {
        QString rowCurrency = currencyAt(index.row());
        QString columnCurrency = currencyAt(index.column());
 
        if (currencyMap.value(rowCurrency) == 0.0)
            return "####";
 
        double amount = currencyMap.value(columnCurrency)
                        / currencyMap.value(rowCurrency);
 
        return QString("%1").arg(amount, 0, 'f', 4);
    }
    return QVariant();
}
 
QVariant CurrencyModel::headerData(int section, Qt::Orientation /* orientation */, int role) const
{
    if (role != Qt::DisplayRole)
        return QVariant();
    return currencyAt(section);
}
 
QString CurrencyModel::currencyAt(int offset) const
{
    return (currencyMap.begin() + offset).key();
}
 
void CurrencyModel::setCurrencyMap(const QMap<QString, double> &map)
{
    currencyMap = map;
    //reset(); // Нет метода в QT5
}
mainwindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    QMap<QString, double> currencyMap;
 
    currencyMap.insert("AUD", 1.3259);
    currencyMap.insert("CHF", 1.2970);
 
    currencyMap.insert("SGD", 1.6901);
    currencyMap.insert("USD", 1.0000);
 
    CurrencyModel currencyModel;
    currencyModel.setCurrencyMap(currencyMap);
 
    QTableView tableView;
    tableView.setModel(&currencyModel);
    tableView.setAlternatingRowColors(true);
 
    QVBoxLayout *vLayout = new QVBoxLayout();
    QHBoxLayout *hLayout = new QHBoxLayout();
 
    vLayout->addWidget(&tableView);
    hLayout->addLayout(vLayout);
    setLayout(hLayout);
}
Почему не работает?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2015, 07:49
Ответы с готовыми решениями:

Как передать собственную модель в частичное представление?
Добрый день, только начинаю разбираться с mvc, помогите, пожалуйста с такой задачей. На...

Как создать собственную сборку?
Здравствуйте, хочу создать свою сборку windows 7 что для этого требуется? Хочу сделать: Что то...

Как создать собственную библиотеку?
А как собственно это сделать? Я выбираю файл - шаблон проекта - библиотека классов. Создается...

Как создать собственную ос для телефона?
Здравствуйте.Есть такой вопрос:&quot;Как создать собственную ос для телефона?&quot;. Допустим есть у меня...

3
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
10.11.2015, 09:21 2
Цитата Сообщение от Dexel Посмотреть сообщение
Почему не работает?
хотя бы по тому, что область жизни CurrencyModel - конструктор MainWindow...
1
Pied Piper
236 / 227 / 57
Регистрация: 15.01.2013
Сообщений: 855
10.11.2015, 10:30 3
Как и QTableView.
1
6 / 6 / 4
Регистрация: 26.06.2015
Сообщений: 83
10.11.2015, 12:52 4
Лучший ответ Сообщение было отмечено Dexel как решение

Решение

Dexel, надо динамически память выделять.
C++ (Qt)
1
CurrencyModel *currencyModel=new CurrencyModel;
Для представления также.

Вместо
C++ (Qt)
1
2
3
4
5
void CurrencyModel::setCurrencyMap(const QMap<QString, double> &map)
{
    currencyMap = map;
    //reset(); // Нет метода в QT5
}
Используй
C++ (Qt)
1
2
3
4
5
6
void CurrencyModel::setCurrencyMap(const QMap<QString, double> &map)
{
    beginResetModel();
    currencyMap = map;
    endResetModel();
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.11.2015, 12:52
Помогаю со студенческими работами здесь

Как создать свою собственную карту на Андроид?
Ребят может ктот подсказать как создать свою собственную карту на Адройд Да конечно, легче взять...

вместо механизма RTTI языка C++ используйте свою собственную модель RTTI
В примере вместо механизма RTTI языка C++ используйте свою собственную модель RTTI. Включите в...

Создать собственную функцию
Даны натуральные числа m, n и целые числа A1,...,An,; B1,...,Bm; C1,..., C10.(1-n, 1-m, 1-10 - это...

Можно ли создать свою собственную рамку?
Люди подскажите можно ли создать свою собственную рамку. не из стандартных, а свою. если можно то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru