最近在用QT画一个只有一个表格的界面,界面继承的mainwindow。为了整个表格能整体自适应整个窗口的变化,试了各种办法,网上比较多的解决办法是通过Layout布局管理器,但这个只适合行列单元格没有固定的情况,在单元格固定的时候,Table会跟随窗口,但单元格是拖不动的,所以在适配各种不同分辨率的屏幕时,这个方法不能简单的套用。
在mainwindow中,直接setlayout会报这样一个错误:
QWidget::setLayout: Attempting to set QLayout "" on MainWindow "MainWindow", which already has a layout
这个错误的原因是mainwindow自身带有一个layout,而QT中一个widget不能同时平行挂两个layout,而将tablewidget直接放到mainwindow自身的layout没找到好用的方法(但测试了一下直接将tablewidget设为setCentralWidget,然后新建layout加进去,发现行不通。)。
解决这个问题,网上前辈们的解决方案是new一个继承mainwindow的Qwidget;
//这个控件新建用来绕开mainwindow的自带layout
QWidget *widget = new QWidget(this);
然后让QTableWidget继承到QWidget窗口下面;
//新建一个表格
QTableWidget *Table = new QTableWidget(widget)
将widget设置为当前窗口的中心控件;
//将widget设置为窗口的中心控件
setCentralWidget(widget);
再新建一个layout(QHBoxLayout、QVBoxLayout都可以),适合自己的界面就好,我这个里是界面只包含一个表格,所以随意了;
//添加布局器 --
QHBoxLayout *windowLayout = new QHBoxLayout;
将table添加到布局器layout中;
windowLayout->addWidget(Table);
最后将Windowlayout设置为widget的layout;
widget->setLayout(windowLayout);
到这里差不多表格table是能自适应窗口的变化了,但是有的童鞋可能会惊喜的发现,行列单元格的变化没有跟着走,我这儿就是这样的情况,解决的办法就是让行列的高宽度跟随者自适应表格的变化,添加如下代码;
//表列随着表格变化而自适应变化
Table->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
//表行随着表格变化而自适应变化
Table->verticalHeader()->setResizeMode(QHeaderView::Stretch);
至此,窗口内的表格整体(包括表格单元格内插的其他控件)是可以自适应跟随窗口的变化了。
整个代码块贴一下:
//下面这个代码块用于设置表格自适应窗口的变化
//-- 适配不同大小分辨率的屏幕
//***************************************************************************
//这个控件新建用来绕开mainwindow的自带layout
QWidget *widget = new QWidget(this);
//新建一个表格
QTableWidget *Table = new QTableWidget(widget);
//表列随着表格变化而自适应变化
Table->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
//表行随着表格变化而自适应变化
Table->verticalHeader()->setResizeMode(QHeaderView::Stretch);
//将widget设置为窗口的中心控件
setCentralWidget(widget);
//添加布局器 -- 垂直
QHBoxLayout *windowLayout = new QHBoxLayout;
windowLayout->addWidget(Table);
widget->setLayout(windowLayout);
//***************************************************************************