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不多说
第二句 设置固定宽度为所在位置的列宽,如果不设置editdocument在初始化调整时将会按默认的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));
这是设置内容宽,不是控件宽,正常情况没有任何问题,但是当焦点不在表格上时就会失败

强调

重写父类事件时,如果不是必须,请返回父类的对应事件

过大

ztextEdit->document()->setTextWidth(columnWidth(column));
用这个方法设置宽度
在edit的高度超过表格的高度时,会自动缩小高度不会完全展示出来
需要重新调整一次

你可能感兴趣的:(Qt学习)