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()之后。代码如下:
= 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()的效果:第一列的内容一般较长,所以更宽,其他列则更窄:
根据具体问题类型,进行步骤拆解/原因原理分析/内容拓展等。
具体步骤如下:/导致这种情况的原因主要是……
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 <table>
元素似乎可以直接设置我想要/期望的列宽。当我尝试将整个表格宽度设置为 100% 时会出现问题,在这种情况下,每个合理大小的列都会对齐到总宽度的 1/n %。
这是我所说的一个例子
第二张桌子看起来很糟糕。绝对没有必要在第一列开始换行,尤其是当现在有 更多 可用空间时。
唯一的区别是第二个表设置为width:100%
。当然,您可以在每列上设置精确的像素或百分比尺寸以相对于彼此进行缩放,但这开始硬编码一些关于每列有多大的猜测工作。在这种情况下,只有 View 或 Edit 链接的列可以非常小,不需要占用任何额外的空间,而有些可以使用更多空间增长,例如可能具有其他更长/更短值的名称/类型。
问:我能否以某种方式保持成比例的列格式,同时允许将整个表格的大小调整为可用宽度的 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的列宽并且充满整个控件的主要内容,如果未能解决你的问题,请参考以下文章