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

 我来答
破晓0612
2018-04-09 · TA获得超过1.1万个赞
知道小有建树答主
回答量:96
采纳率:100%
帮助的人:2.6万
展开全部

由于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()的效果:第一列的内容一般较长,所以更宽,其他列则更窄:

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

Lordnazgul
2017-11-17
知道答主
回答量:2
采纳率:0%
帮助的人:1831
展开全部
//设置表格的对齐方式为均分窗口
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//均分列
table->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);//均分行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友2e27ccc06
推荐于2017-11-17 · TA获得超过259个赞
知道小有建树答主
回答量:122
采纳率:100%
帮助的人:70.2万
展开全部
采用自定义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;
}
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
aijiangaa111
2016-05-27 · TA获得超过995个赞
知道小有建树答主
回答量:430
采纳率:87%
帮助的人:121万
展开全部
m_TableView->horizontalHeader()->setStretchLastSection(true); //最后一个填充最后的空白位置
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式