Qt如何按比例分配QTableView的列宽并且充满整个控件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt如何按比例分配QTableView的列宽并且充满整个控件相关的知识,希望对你有一定的参考价值。

由于Qt中的表格控件可以通过从QTableView或QTableWidget派生子类实现。

所以这里就可以利用表格的列宽和行高的设置来实现:

方法一:

1.调用表头的setSectionResizeMode()方法,代码如下:

m_tableView->horizontalHeader()->
setSectionResizeMode(QHeaderView::ResizeToContents);

2.参数QHeaderView::ResizeToContens说明:调整列宽以适应单元内容。也就是说:

    当单元内的文本较长的时候,这种方法将会严重影响表格的阅读。

    这种方法只适合端文本内容的使用。

    此外,设置了这种缩放方式之后,表头就不能再被拉伸完全失去响应。

方法二:

1.QTableView类还有一个成员方法:setColumnWidth(),用来设置表格列宽的。但是注意对setColumnWidth()的调用都要放在setModel()之后。代码如下: 

m_viewList
 = new QTableView(this);m_viewList->setSelectionBehavior(QAbstractItemView::SelectRows);
m_viewList->setSelectionMode(QAbstractItemView::SingleSelection);
m_viewList->setSortingEnabled(false);m_viewList->verticalHeader()->hide();
m_viewList->setWordWrap(false);m_viewList->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);
m_viewList->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
m_viewList->setShowGrid(false);m_viewList->setEditTriggers(QAbstractItemView::NoEditTriggers);
m_viewList->horizontalHeader()->setHighlightSections(false);
m_viewList->setItemDelegate(new NoFocusDelegate());m_viewList->setModel(m_proxyModel);
m_viewList->setAlternatingRowColors(true);  //
 alternative colorsm_viewList->setFrameShape(QFrame::NoFrame); //
 column widthm_viewList->setColumnWidth(0,
 85);m_viewList->setColumnWidth(1,
 180);m_viewList->setColumnWidth(2,
 90);m_viewList->setColumnWidth(3,
 80);m_viewList->setColumnWidth(4,
 80);m_viewList->setColumnWidth(5,
 30);m_viewList->setColumnWidth(6,
 40);m_viewList->setColumnWidth(7,
 120);m_viewList->setColumnWidth(8,
 120);m_viewList->setColumnWidth(9,
 120);

2.效果对比:

在Model设置好之前调用setColumnWidth()的效果:每一列的宽度都是一样,没有区别对待:

在Model设置好之后调用setColumnWidth()的效果:第一列的内容一般较长,所以更宽,其他列则更窄:

根据具体问题类型,进行步骤拆解/原因原理分析/内容拓展等。
具体步骤如下:/导致这种情况的原因主要是……

参考技术A //设置表格的对齐方式为均分窗口
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//均分列
table->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);//均分行
参考技术B 采用自定义tableview方法处理,重载paintEvent,sizeHintForColumn
void CBaseTableView::paintEvent(QPaintEvent *event)

int colCount = horizontalHeader()->count();
for (int i = 0; i < colCount-1; i++)

resizeColumnToContents(i);

return QTableView::paintEvent(event);

int CBaseTableView::sizeHintForColumn(int column) const

if (m_colsWidthPercent.size() == horizontalHeader()->count())

if (m_colsWidthPercent.value(column) == 0)

return this->columnWidth(column);

else

return m_colsWidthPercent.value(column)*(this->width() - m_colsFixedWidth) / 100;


else

int colCount = horizontalHeader()->count();
return this->width()/colCount;

参考技术C m_TableView->horizontalHeader()->setStretchLastSection(true); //最后一个填充最后的空白位置

HTML表格 - 表格宽度100%时保持列宽比例

【中文标题】HTML表格 - 表格宽度100%时保持列宽比例【英文标题】:HTML Table - Maintain column width proportion when table width 100% 【发布时间】:2018-02-25 02:34:42 【问题描述】:

默认的 html &lt;table&gt; 元素似乎可以直接设置我想要/期望的列宽。当我尝试将整个表格宽度设置为 100% 时会出现问题,在这种情况下,每个合理大小的列都会对齐到总宽度的 1/n %。

这是我所说的一个例子

第二张桌子看起来很糟糕。绝对没有必要在第一列开始换行,尤其是当现在有 更多 可用空间时。

唯一的区别是第二个表设置为width:100%。当然,您可以在每列上设置精确的像素或百分比尺寸以相对于彼此进行缩放,但这开始硬编码一些关于每列有多大的猜测工作。在这种情况下,只有 ViewEdit 链接的列可以非常小,不需要占用任何额外的空间,而有些可以使用更多空间增长,例如可能具有其他更长/更短值的名称/类型。

问:我能否以某种方式保持成比例的列格式,同时允许将整个表格的大小调整为可用宽度的 100%?

Demo in jsFiddle

堆栈片段中的演示

table 
    border-collapse: collapse;
    border-spacing: 0;
    table-layout: fixed;


table th 
    background: lightblue;


table th, table td 
    border: lightgrey 1px solid;
    padding: .1em 0.2em;
<h4>Width Not Set</h4>

<table id="example1" >
  <thead>
    <tr>
      <th>Name</th>
      <th>Type</th>
      <th>Start</th>
      <th>Stop</th>
      <th>View</th>
      <th>Edit</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Regular Size Name</td>
      <td>Order</td>
      <td>01/01/2017</td>
      <td>02/02/2017</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Pretty Long Name Size Actually</td>
      <td>Adjustment</td>
      <td>01/01/2017</td>
      <td>04/03/2018</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Regular Size Name</td>
      <td>Adjustment</td>
      <td>08/01/2017</td>
      <td>02/02/2019</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Pretty Long Name Size Actually</td>
      <td>Order</td>
      <td>08/01/2017</td>
      <td>02/02/2019</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
  </tbody>
</table>


<h4>Width 100%</h4>

<table id="example2" style="width:100%">
  <thead>
    <tr>
      <th>Name</th>
      <th>Type</th>
      <th>Start</th>
      <th>Stop</th>
      <th>View</th>
      <th>Edit</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Regular Size Name</td>
      <td>Order</td>
      <td>01/01/2017</td>
      <td>02/02/2017</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Pretty Long Name Size Actually</td>
      <td>Adjustment</td>
      <td>01/01/2017</td>
      <td>04/03/2018</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Regular Size Name</td>
      <td>Adjustment</td>
      <td>08/01/2017</td>
      <td>02/02/2019</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Pretty Long Name Size Actually</td>
      <td>Order</td>
      <td>08/01/2017</td>
      <td>02/02/2019</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
  </tbody>
</table>

【问题讨论】:

神秘的否决票?嘿,至少这里有一个minimal reproducible example 和一些现有的调试步骤。不要看到不知道的危害。 同意,也许这不是有史以来最有见地的 CSS 问题,但样本无可挑剔,问题也不是太明显,我认为 table-layout 不在这个最常用的 CSS 列表中特性。我似乎有很多质量较差的问题,没有任何反对意见。 【参考方案1】:

像这样?

注意: 我从两个表中删除了width:100%,没有这个设置CSS效果最好!

代码来自旧的 SO 帖子。请参阅下文。

SO Answer

代码片段:

table 
  border-collapse: collapse;
  border-spacing: 0;
  table-layout: fixed;


table th 
  background: lightblue;


table th,
table td 
  border: lightgrey 1px solid;
  padding: .1em 0.2em;

tr td:last-child
    width:1%;
    white-space:nowrap;
<h4>Width Not Set</h4>

<table id="example1">
  <thead>
    <tr>
      <th>Name</th>
      <th>Type</th>
      <th>Start</th>
      <th>Stop</th>
      <th>View</th>
      <th>Edit</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Regular Size Name</td>
      <td>Order</td>
      <td>01/01/2017</td>
      <td>02/02/2017</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Pretty Long Name Size Actually</td>
      <td>Adjustment</td>
      <td>01/01/2017</td>
      <td>04/03/2018</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Regular Size Name</td>
      <td>Adjustment</td>
      <td>08/01/2017</td>
      <td>02/02/2019</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Pretty Long Name Size Actually</td>
      <td>Order</td>
      <td>08/01/2017</td>
      <td>02/02/2019</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
  </tbody>
</table>


<h4>Width 100%</h4>

<table id="example2">
  <thead>
    <tr>
      <th>Name</th>
      <th>Type</th>
      <th>Start</th>
      <th>Stop</th>
      <th>View</th>
      <th>Edit</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Regular Size Name</td>
      <td>Order</td>
      <td>01/01/2017</td>
      <td>02/02/2017</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Pretty Long Name Size Actually</td>
      <td>Adjustment</td>
      <td>01/01/2017</td>
      <td>04/03/2018</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Regular Size Name</td>
      <td>Adjustment</td>
      <td>08/01/2017</td>
      <td>02/02/2019</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Pretty Long Name Size Actually</td>
      <td>Order</td>
      <td>08/01/2017</td>
      <td>02/02/2019</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
  </tbody>
</table>

















<div style='position:fixed;bottom:0;left:0; background:lightgray;width:100%;'>
  About this SO question:
  <a href='https://***.com/q/46247387/1366033'>
        HTML Table - Maintain column width proportion when table width 100%
    </a>
</div>
https://jsfiddle.net/KyleMit/dabpc4sL/

【讨论】:

【参考方案2】:

这是一个解决方案的尝试

按原样利用表格的初始呈现来确定相对列大小。循环遍历每个并显​​式设置大小,以便一旦表格以编程方式将大小调整为 100%,它们将保持相同的比例

function LockColumnWidthAndResize($table) 
    $table.find('tr th').each(function() 
      $(this).width($(this).width())
    );
    $table.width("100%");

优点:不需要提前对内容的宽度进行硬编码缺点:小 Kludgy 并且有一些 Flash 的无样式内容。

Demo in jsFiddle

StackSnippets 中的演示

$(function() 

  LockColumnWidthAndResize($('#example2'))

  function LockColumnWidthAndResize($table) 
    $table.find('tr th').each(function() 
      $(this).width($(this).width())
    );
    $table.width("100%");
  
  
);
table 
    border-collapse: collapse;
    border-spacing: 0;
    table-layout: fixed;


table th 
    background: lightblue;


table th, table td 
    border: lightgrey 1px solid;
    padding: .1em 0.2em;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<h4>Width Not Set</h4>

<table id="example1" >
  <thead>
    <tr>
      <th>Name</th>
      <th>Type</th>
      <th>Start</th>
      <th>Stop</th>
      <th>View</th>
      <th>Edit</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Regular Size Name</td>
      <td>Order</td>
      <td>01/01/2017</td>
      <td>02/02/2017</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Pretty Long Name Size Actually</td>
      <td>Adjustment</td>
      <td>01/01/2017</td>
      <td>04/03/2018</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Regular Size Name</td>
      <td>Adjustment</td>
      <td>08/01/2017</td>
      <td>02/02/2019</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Pretty Long Name Size Actually</td>
      <td>Order</td>
      <td>08/01/2017</td>
      <td>02/02/2019</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
  </tbody>
</table>


<h4>Width - Set 100% dynamically</h4>

<table id="example2">
  <thead>
    <tr>
      <th>Name</th>
      <th>Type</th>
      <th>Start</th>
      <th>Stop</th>
      <th>View</th>
      <th>Edit</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Regular Size Name</td>
      <td>Order</td>
      <td>01/01/2017</td>
      <td>02/02/2017</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Pretty Long Name Size Actually</td>
      <td>Adjustment</td>
      <td>01/01/2017</td>
      <td>04/03/2018</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Regular Size Name</td>
      <td>Adjustment</td>
      <td>08/01/2017</td>
      <td>02/02/2019</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Pretty Long Name Size Actually</td>
      <td>Order</td>
      <td>08/01/2017</td>
      <td>02/02/2019</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
  </tbody>
</table>

【讨论】:

【参考方案3】:

问题在于您添加到table 标记中的table-layout: fixed 规则,只需将其删除即可。来自w3schools:

fixed:固定表格布局算法:

水平布局只取决于表格的宽度和列的宽度,而不是单元格的内容 允许浏览器比自动表格布局更快地布置表格 一旦收到第一行,浏览器就可以开始显示表格了

table 
    border-collapse: collapse;
    border-spacing: 0;
    /*table-layout: fixed;*/


table th 
    background: lightblue;


table th, table td 
    border: lightgrey 1px solid;
    padding: .1em 0.2em;
<h4>Width Not Set</h4>

<table id="example1" >
  <thead>
    <tr>
      <th>Name</th>
      <th>Type</th>
      <th>Start</th>
      <th>Stop</th>
      <th>View</th>
      <th>Edit</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Regular Size Name</td>
      <td>Order</td>
      <td>01/01/2017</td>
      <td>02/02/2017</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Pretty Long Name Size Actually</td>
      <td>Adjustment</td>
      <td>01/01/2017</td>
      <td>04/03/2018</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Regular Size Name</td>
      <td>Adjustment</td>
      <td>08/01/2017</td>
      <td>02/02/2019</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Pretty Long Name Size Actually</td>
      <td>Order</td>
      <td>08/01/2017</td>
      <td>02/02/2019</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
  </tbody>
</table>


<h4>Width 100%</h4>

<table id="example2" style="width:100%">
  <thead>
    <tr>
      <th>Name</th>
      <th>Type</th>
      <th>Start</th>
      <th>Stop</th>
      <th>View</th>
      <th>Edit</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Regular Size Name</td>
      <td>Order</td>
      <td>01/01/2017</td>
      <td>02/02/2017</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Pretty Long Name Size Actually</td>
      <td>Adjustment</td>
      <td>01/01/2017</td>
      <td>04/03/2018</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Regular Size Name</td>
      <td>Adjustment</td>
      <td>08/01/2017</td>
      <td>02/02/2019</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
    <tr>
      <td>Pretty Long Name Size Actually</td>
      <td>Order</td>
      <td>08/01/2017</td>
      <td>02/02/2019</td>
      <td><a href="#View">View</a></td>
      <td><a href="#Edit">Edit</a></td>
    </tr>
  </tbody>
</table>

【讨论】:

嗯,是的,就可以了。我尝试在开发工具中打开和关闭它以查看它是否产生任何影响,但我猜当时它已经渲染并下定决心。无论有没有它,我都应该从一开始就进行一次干净的运行。

以上是关于Qt如何按比例分配QTableView的列宽并且充满整个控件的主要内容,如果未能解决你的问题,请参考以下文章

QTableView 列宽可调

Qt中的QTableView 中的列放入Widget

PyQt:如何调整 QTableView 标题大小/列宽

如何在 QTableView 的列中显示下拉列表并根据下拉列表进行过滤

HTML表格 - 表格宽度100%时保持列宽比例

Colspan 强制设置相等的列宽