QTextEdit适应内容调整⼤⼩关于调整控件⼤⼩
主要为⾃适应部分
基本情况:
在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()+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由于设置⼤⼩并不能⾃动调整
注: 解决这个问题不能重写表格的resizeEvent, 调整列宽或⾏⾼时只有在出现(或消失)滚动条的那个瞬间才会触发 * resizeEvent* 事件*所以重写paintEvent
代码
void ZTableWidget::paintEvent(QPaintEvent *e)
{
ztextEdit->setFixedWidth(columnWidth(column));
resizeRowHeight();
QTableWidget::paintEvent(e);
}
重写设置宽度,然后调整⾼度,⽤⽗类的⽅法完成表格
以基本完成功能但是有以下需要注意的地⽅
初始化时的问题
当点表格初始化时,在表格构造函数完成前,有关表格的任何size都是拿不到的(会返回默认值) 上⾯的代码能成功获取宽度,是在⾃适应之前⾃⼰设置了表格宽和列宽
但是当表格初始化完成,不存在该问题
焦点问题
当有需要点击按钮或其他因素表格重新绘制(注意不是重新构造)
这时焦点不在表格上,某些情况下会导致⾃适应失败
⽐如设置宽度时
ztextEdit->document()->setTextWidth(columnWidth(column));
这是设置内容宽,不是控件宽,正常情况没有任何问题,但是当焦点不在表格上时就会失败table设置内边框
强调
重写⽗类事件时,如果不是必须,请返回⽗类的对应事件
过⼤
ztextEdit->document()->setTextWidth(columnWidth(column));
⽤这个⽅法设置宽度
在edit的⾼度超过表格的⾼度时,会⾃动缩⼩⾼度不会完全展⽰出来
需要重新调整⼀次

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。