基本情况:
在TableWidget(简称table)内加入(简称edit)TextEdit让table自适应edit的内容调整高度
自己的Table类
class ZTableWidget : public QTableWidgt
自己的edit类
class ZTextEdit : public QTextEdit
在ZTextEdit 中 重写
QSize sizeHint() const;
重写代码
QSize ZTextEdit::sizeHint() const
{
//高度 +2 避免出现下拉框
return QSize(document()->size().width(), document()->size().height()43;2);
}
可返回任意的Qsize()由于要自适应大小,所以返回内容的document的size
注: 在自适应大小时该函数会被自动调用
为了实现输入完成后就自动调整需要重写
void focusOutEvent (QFocusEvent * event);
代码
void ZTextEdit::focusOutEvent (QFocusEvent * event)
{
Q_UNUSED(event)
emit signalDataChanged(text);
return QTextEdit::focusOutEvent(event);
}
signalDataChanged 为自定义信号(自定义信号方法查询有关文档)
最后一句返回父类的对应事件很重要,Qt的事件很复杂
如果不确定是否完全不执行父类的有关操作,请调用父类相关的事件
这里只是需要发送一个自定义信号,其余操作不变,所以返回父类的事件操作
return QTextEdit::focusOutEvent(event);
之后在ZTableWidget中自定义槽函数
void resizeTextEditRow(const QString &text);
将edit的自定义信号与该槽函数连接
connect(ztextEdit, SIGNAL(signalDataChanged(const QString &)),
this, SLOT(resizeTextEditRow(const QString &)));
槽函数的实现
void ZTableWidget::resizeTextEditRow(const QString &text)
{
resizeRowsToContents();
}
resizeRowsToContents();
这个函数是继承自QTableView的,可以自适应内容调整行高(也正是这个函数会自动调用 * sizeHint()
* 获取大小)
然后就是将edit放进table
1 ZTextEdit *ztextEdit = new ZTextEdit();
2 ztextEdit->setFixedWidth(columnWidth(column));
3 ztextEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
4 setCellWidget(row, column ztextEdit);
1 和 4不多说
第二句 设置固定宽度为所在位置的列宽,如果不设置edit的document在初始化调整时将会按默认的20宽度
来计算内容高
第三句 在某些情况下调整完高度edit会有一小部分不能显示完全(不是内容,是边框等,根本看不出不影响)
此时会自动添加滚动条,由于滚动条的存在,内容宽被压缩,高度变高,但是edit的高度已经调整完毕,
(多出来的部分拖动滚动条可以显示出来)所以看起来是调整错误的现象
这时已经基本满足要求,但是仍然有问题
1.窗口需要能最大化或手动调整大小
重写窗体的resizeEvent(QResizeEvent *) 事件
.h
protected:
void resizeEvent(QResizeEvent *);
.cpp
void QInfoManage::resizeEvent(QResizeEvent *event)
{
/*
* 不调用父类函数会造成不能正确
* 重新设置高度
*/
QWidget::resizeEvent(event);
tableWidget->resizeTextEditRow();
}
QInfoManage 为自己的窗口类 继承QWidget 其余不多说
感觉好像完成了,但是当手动调整edit对应表格的列宽时
edit由于设置大小并不能自动调整
所以重写paintEvent
代码
void ZTableWidget::paintEvent(QPaintEvent *e)
{
ztextEdit->setFixedWidth(columnWidth(column));
resizeRowHeight();
QTableWidget::paintEvent(e);
}
重写设置宽度,然后调整高度,用父类的方法完成表格
以基本完成功能但是有以下需要注意的地方
当点表格初始化时,在表格构造函数完成前,有关表格的任何size都是拿不到的(会返回默认值)
上面的代码能成功获取宽度,是在自适应之前自己设置了表格宽和列宽
但是当表格初始化完成,不存在该问题
当有需要点击按钮或其他因素表格重新绘制(注意不是重新构造)
这时焦点不在表格上,某些情况下会导致自适应失败
比如设置宽度时
ztextEdit->document()->setTextWidth(columnWidth(column));
这是设置内容宽,不是控件宽,正常情况没有任何问题,但是当焦点不在表格上时就会失败
重写父类事件时,如果不是必须,请返回父类的对应事件
ztextEdit->document()->setTextWidth(columnWidth(column));
用这个方法设置宽度
在edit的高度超过表格的高度时,会自动缩小高度不会完全展示出来
需要重新调整一次