QTableView: как редактировать нередактируемые ячейки в программе?

Как это сделать с помощью вызова метода model->setData()?

Я получил класс под названием «MyStandardItemModel» из QStandardItemModel. Я сделал третий и четвертый столбцы недоступными для редактирования, переопределив метод защищенных виртуальных флагов. Вот как это происходит:

#define TX_PACKET_COLUMN (4u)
#define RX_PACKET_COLUMN (5u)

Qt::ItemFlags MyStandardItemModel::flags(const QModelIndex& index) const
{
    if (index.column() == TX_PACKET_COLUMN || index.column() == RX_PACKET_COLUMN)
    {
        return (QStandardItemModel::flags(index) & ~Qt::ItemIsEditable);
    }
    else
    {
        return QStandardItemModel::flags(index);
    }
}

...

//Set model
ui->testCaseTableView->setModel(model);

Сделав это, я не могу редактировать ячейки в третьем и четвертом столбцах.

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

Я попытался просто написать обработчик doubleclick() для QTreeView и просто скопировать некоторые данные в ячейки, чтобы посмотреть, можно ли копировать данные в нередактируемые ячейки.

Эта операция завершается ошибкой, и данные не записываются в нередактируемые ячейки.

Здесь вы можете найти обработчик двойного клика:

void MainWindow::on_testCaseTableView_doubleClicked(const QModelIndex &index)
{
    QVariant variant;
    variant.toString() = "AA";

    if((index.column() == TX_PACKET_COLUMN)||(index.column() == RX_PACKET_COLUMN))
    {
        model->setData(index, variant);   // set new value
    }

}

Операция setData(..) очищает уже записанные данные в ячейках, но строка "AA" не записывается. Подскажите, пожалуйста, как скопировать некоторые данные в нередактируемые ячейки внутри кода.

введите здесь описание изображения


person Katoch    schedule 28.09.2013    source источник
comment
Почему вы не наследуете QTIM вместо QAIM, кстати, когда речь идет о таблицах?   -  person lpapp    schedule 28.09.2013
comment
Редактируемые ячейки или нет, не должны влиять на то, как вы можете программно устанавливать и отображать значения. Ответ, вероятно, кроется в моделях ::setData и ::data. Я бы отладил их.   -  person user2672165    schedule 28.09.2013
comment
вариант.toString() = АА; -› выглядит неправильно, и ошибка будет в вашей реализации setData() для подкласса модели. Можете ли вы поделиться этим кодом? Правильно ли вы излучаете сигнал изменения данных?   -  person lpapp    schedule 28.09.2013


Ответы (2)


Как я указал в своем комментарии, вы должны исправить эту первую проблему:

вместо:

QVariant variant;
variant.toString() = "AA";

ты должен написать

QVariant variant = QLatin1String("AA");

В общем, вы должны изучить реализацию setData(...) для таких случаев, правильно ли вы передаете сигнал изменения данных и т. д., но здесь вы вводите предыдущую проблему, которая может привести к проблемам, поэтому давайте это исправим.

Обратите внимание: вам следует использовать QLatin1String, чтобы избежать ненужного явного преобразования необработанного char* в QString. В целом это хорошая практика, и она доступна как в Qt 4, так и в Qt 5.

Хотя вы также можете использовать макрос QStringLiteral для очень эффективного создания QString с магией шаблона из вашего необработанного литерала, но для этого требуется C++11.

person lpapp    schedule 28.09.2013

Набор QVariant пуст. В вашей модели не должно быть ошибок. Ошибка в этой строке:

variant.toString() = "AA";

изменить на:

QVariant variant("AA"); // just for testing anyway
person user2672165    schedule 28.09.2013
comment
@Lazlo Papp: Если бы вы читали более внимательно, вы бы заметили, что в вопросе сказано, что операция setData(..) очищает уже записанные данные в ячейках. Моя логика не была ошибочной. Я признаю, что вы первыми заметили неисправную линию. Я прихожу к мысли об этом, когда я был в моем саду. Должен был признать тебя да. Я отклонил ваш ответ, потому что в этом случае было очень агрессивно сосредоточиться на кодировке символов. Это было потому, что, по моему мнению, я понял все это сам, но я пойму, если вы думаете, что я украл вашу идею. Тем не менее кажется, что я понял это все это время. - person user2672165; 28.09.2013