Qt C++ Заголовки таблицы

355
29 июня 2017, 03:45

Привет всем. Есть TableWidget и есть QStringList c элементами.

for (int i = 0; i < 3; i++)
{
   ui->tableWidget->insertItem(i);
}    
QStringList list;
list << 1 << 2 << 3;
ui->tableWidget->setHorizontalHeaderLabels(list);
ui->tableWidget->horizontalHeader()->setVisible(true);

Что нужно? Как сделать так что бы список можно было отмечать чекбоксами. Т.е к примеру я не хочу показывать 2-й столбец заголовка. Мои действия: убрал галочку c элемента номер 2 из списка и показываются в заголовке только 1-й элемент и 3-й.

Answer 1

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

Теперь самое главное. Когда отмечается ваш checkbox, ваша программа должна вызвать метод модели, который менял бы флаги видимости столбцов. В этом методе кроме самого управления флагами нужно вызвать protected-методы beginInsertColumns и endInsertColumns. Например, он может выглядеть так:

void MyModel::setColumnVisible(int column, bool visible)
{
    if (visible)
    {
        beginInsertColumns(QModelIndex(), column, column);
        m_visibility[column] = true;  //Ваш массив флагов видимости
        endInsertColumns();
    }
    else
    {
        beginRemoveColumns(QModelIndex(), column, column);
        m_visibility[column] = false;
        endRemoveColumns();
    }
}

Соответственно, нужно написать метод columnCount с учетом видимости. А в методе data учитывать смещение индексов таблицы.

Полная информация о моделях

После того, как вы создадите модель, данные можно будет отображать на форме с помощью представления. Для этого используете QTableView. К нему подключайте вашу модель.

Логически правильнее будет реализовать этот функционал с помощью двух моделей: одна будет только хранить данные, а другая - управлять видимостью. Но она будет уже наследовать не QAbstractTableModel, а QAbstractProxyModel.

READ ALSO
Почему i[array] подобен array[i]? [дубликат]

Почему i[array] подобен array[i]? [дубликат]

На данный вопрос уже ответили:

241
shared_ptr ошибка при линковке c++

shared_ptr ошибка при линковке c++

pastebincom - исходный код заголовочного файла с реализацией shared_ptr

218
Ограничение выбора в календарной форме

Ограничение выбора в календарной форме

Можно ли в календарной форме datepicker ограничить возможность выбора только определенным днем недели? Средствами из коробки, так сказатьВ документации...

335