Я пытаюсь сделать что-то, что, кажется, должно быть очень простым, но чем больше я смотрю на это, мне интересно, если это ошибка Qt.
Итак, у меня есть QTableView
, в котором есть столбцы, которые можно показывать / скрывать по желанию пользователя.После того, как я инициализирую таблицу, я вызываю пользовательский метод restoreColumns()
, который скрывает столбцы (используя QTableView::hideColumn()
), которые пользователь скрыл при последнем открытии графического интерфейса.
Проблема возникает тогда, когда пользователь пытается показать столбцы, которые были скрыты пользователем во время последнего запуска графического интерфейса.Соответствующий сигнал / слот вызывается и запускается, но по какой-то причине QTableView
не обновляется для отображения столбца.
Что странно, что у любого столбца, который уже отображается (не был скрыт пользователем при последнем запуске графического интерфейса), нет проблем с отображением / скрытием.
Есть мысли?Спасибо!
Вот как я инициализирую таблицу ...
m_tableModel = new mytablemodel();
m_tableView = new mytableview();
m_tableView->setItemDelegate(m_tableDelegate);
m_tableView->setModel(m_tableModel);
Мясо метода restoreColumns ():
for (int i=0; i<horizontalHeader()->count(); i++) {
// load size to restore previous width
...
horizontalHeader()->resizeSection(i, width); // restore width
// load previous column position
...
// restore column order
int currentVisualIndex = horizontalHeader()->visualIndex(i);
if (currentVisualIndex != visualIndex)
horizontalHeader()->moveSection(currentVisualIndex, visualIndex);
// load previous hidden/shown state
...
if (columnHidden) {
hideColumn(i);
} else {
showColumn(i);
}
}
Ниже приведен пример кодачтобы показать / скрыть один из столбцов.
void mytableview::showAColumn(bool checked) {
// mytableview is a subclass of qtableview
if (checked)
showColumn(COLUMN_A); // COLUMN_A is an enum for the column
else
hideColumn(COLUMN_A);
}
К которому подключен QAction
, доступ к которому можно получить из меню и контекстного меню QHeaderView
QTableView
.
connect(action, SIGNAL(toggled(bool)), this, SLOT(showAColumn(bool)));