QTextEdit 适应内容调整大小 我会带着你远行 2022-06-09 03:50 667阅读 0赞 ## 关于调整控件大小 ## ## 主要为自适应部分 ## 基本情况: 在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));` 这是设置内容宽,不是控件宽,正常情况没有任何问题,但是当焦点不在表格上时就会失败 ## 强调 ## 重写父类事件时,如果不是必须,请返回父类的对应事件 ## 过大 ## `ztextEdit->document()->setTextWidth(columnWidth(column));` 用这个方法设置宽度 在edit的高度超过表格的高度时,会自动缩小高度不会完全展示出来 需要重新调整一次
还没有评论,来说两句吧...