2013-11-15 6 views
4

Я пишу простой TableView согласнодинамически добавлять данные в QTableView

http://harmattan-dev.nokia.com/docs/library/html/qt4/itemviews-addressbook.html

class MyModel : public QAbstractTableModel { 
    Q_OBJECT 
public: 
    QList<QPair<string, int> > data_; 
.... 

как добавить строки в модели динамически? data_.insert (..) не изменит вид, в настоящее время я пишу функцию, чтобы добавить новую строку:

void my_append_data(const string& first, int second) { 
    int row = rowCount(QModelIndex()); 
    insertRow(row); // insert a empty row 
    // fill the row 
    setData(createIndex(row, 0), QVariant::fromValue<string>(first), Qt::EditRole); 
    setData(createIndex(row, 1), QVariant::fromValue<int>(second), Qt::EditRole); 
} 
// usage 
model.my_append_data("11111", 111); 
model.my_append_data("22222", 222); 

Это кажется неэффективным привести к тому УстановитьДанные вызывается дважды, когда добавить строку, потому что вы два столбцов, и в будущем может быть больше столбцов.

Любой лучший способ добавить строки?

Спасибо.

ответ

6

Я не уверен, почему вы считаете, что это неэффективно. Однако вы можете сделать это проще.

Я бы, наверное, написать функцию, как это, что сделало бы его более будущего доказательства против изменений подсчетов столбцов и типов:

void my_append_data(const QVariantList &data) { 
    insertRow(rowCount(QModelIndex())); 

    foreach(const QVariant &item, data) { 
     setData(createIndex(row, 0), item, Qt::EditRole); 
    } 
} 

Использование:

model.my_append_data(QVariantList() << "11111" << 111); 

Basic (и большинство типов Qt) могут быть неявно преобразованы в QVariant s, поэтому нет необходимости звонить QVariant::fromValue()

Также, если вы используете Qt, rmally использовать QString s, а не std::string s.

+0

Это приятно, спасибо Крису. – aj3423

+0

Я не понимаю, почему этот код лучше, чем код, о котором идет речь, я бы сказал, что это еще хуже. ИМО мой ответ намного лучше. –

3

Ваш код странный! Когда вы подклассифицируете QAbstractTableModel и выполняете некоторую операцию над данными (на вашем data_), вам просто нужно исправить правильные сигналы (или вызвать некоторые защищенные методы для таких сигналов), чтобы сообщить представлениям, что что-то было изменено в модели!

Так что в вашем случае это должно быть что-то вроде как:

void my_append_data(const string& first, int second) { 
    int newRow = data_.count(); 
    beginInsertRows(QModelIndex(), newRow, newRow); 
    data_.append(QPair<string, int>(first, second)); 
    endInsertRows(); 
} 

Если другие части вас модели правильно написано, он должен работать идеально.

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

+0

У меня есть вопрос, предположим - 1. У меня есть вызов MyModelClass, который получает QAbstrackTableModel. 2. Мои данныеSource для представления создаются, изменяются, добавляются, удаляются за пределами MyModelClass. MyModelClass содержит только указатель/ссылку этого источника данных. 3. Как я могу синхронизировать данные между dataSource и View? 'data_.append (QPair (первый, второй)); ' Я не могу этого сделать, потому что изменение происходит в другом классе. – sami1592

+0

Модель - это прокси-объект для фактических данных. Поэтому, если данные изменяются каким-то внешним кодом, этот код должен предоставить некоторый механизм уведомления, который вы должны использовать для отправки обновлений для модели данных. Это зависит от деталей вашей проблемы. –

Смежные вопросы