【问题标题】:Showing a Hidden QTableView Column显示隐藏的 QTableView 列
【发布时间】:2011-09-15 18:40:00
【问题描述】:

我正在尝试做一些看起来应该很简单的事情,但我越是研究它,我就越想知道它是否是一个 Qt 错误。

所以,我有一个QTableView,它的列可以根据用户的喜好显示/隐藏。初始化表后,我调用自定义的restoreColumns() 方法隐藏用户上次打开GUI 时隐藏的列(使用QTableView::hideColumn())。

当用户试图显示上次运行 GUI 时被用户隐藏的列时,问题就出现了。适当的信号/插槽被调用并运行,但由于某种原因,QTableView 没有更新以显示该列。

奇怪的是,任何已经显示的列(在上次运行 GUI 时未被用户隐藏)都没有隐藏/显示的问题。

有什么想法吗?谢谢!


这是我初始化表格的方式...

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)));  

【问题讨论】:

  • 您可以尝试在showColumn() 之后添加resizeColumnToContents 调用吗? (我认为hide 发生得太早了,该列的大小可能无效)
  • 试过了 - 没有变化。我认为这与在 tableview 被绘制到屏幕上之前 hideColumn 如何出现有关......虽然我不确定在 tableview 被绘制后我将如何调用我的 restoreColumns() 方法。
  • 我刚刚在 restoreColumns() 方法中添加了更多细节。似乎我正在调整列大小的地方是它被搞砸的地方。当我注释掉该部分时,它按预期工作。但是,我随后失去了恢复以前的列宽的能力......
  • 我终于找出了有问题的代码......原来当我加载隐藏列的先前宽度时,保存的宽度为0。所以,当调整列大小时确保宽度大于 0。执行此操作,然后列将按预期显示/隐藏。
  • 添加您的评论作为答案,然后接受它。 (您可以接受自己的答案。)这样就可以很容易地找到遇到同样问题的其他人。

标签: qt qt4 qtableview


【解决方案1】:

当您加载隐藏列的先前宽度时,保存的宽度为 0。
因此,在调整列大小时,请确保宽度大于 0。
执行此操作,然后列将按预期显示/隐藏。

【讨论】:

  • 这应该记录在 Qt QTableView::hideColumn() 描述中。
猜你喜欢
  • 1970-01-01
  • 2012-12-12
  • 2013-09-30
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
相关资源
最近更新 更多