QTextEdit 适应内容调整大小
来源:互联网 发布:淘宝上怎么兼职赚钱 编辑:程序博客网 时间:2024/05/16 09:27
关于调整控件大小
主要为自适应部分
基本情况:
在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的高度超过表格的高度时,会自动缩小高度不会完全展示出来
需要重新调整一次
- QTextEdit 适应内容调整大小
- 调整文本框大小以适应内容
- Android 自定义TextView实现文本内容自动调整字体大小以适应TextView的大小
- Android 自定义TextView实现文本内容自动调整字体大小以适应TextView的大小
- textarea自动适应内容大小
- UITextView根据内容适应大小
- JFrame自动调整大小适应子控件
- 如何调整窗口以适应客户区大小
- 【转贴】如何调整窗口以适应客户区大小
- ubuntu remmina 调整窗口大小以适应远程分辨率
- wince windows moible Dialog 调整大小 适应屏幕
- TextView设置wrap_content时,使其宽高适应文字内容大小而不是适应background大小
- showModalDialog根据内容自动调整窗口大小
- 使IFrame根据内容自动调整大小
- 背景图片随网页内容自动调整大小
- showModalDialog根据内容自动调整窗口大小
- 调整hadoop 集群datanode 物理内容大小
- iframe自动根据内容调整大小
- 两道2017华为校招Java面试题
- 《大唐姻缘传》 (李治篇)第四章 勤政事朕染风疾 同一心开疆拓土
- rem单位适配
- 考研复习之栈(一)
- c++编译 (.obj, .lib, .dll, .exe的关系(附:lib和DLL的区别))
- QTextEdit 适应内容调整大小
- Google Protocol Buffers 入门
- inputAccessoryView和inputView的区别
- effective C++条款三十六解读
- easy-chat之好友列表
- hdu 1213 How Many Tables
- vs2013+opencv3.2配置于仕琪人脸检测算法
- C++——USACO Section 2.4 题解
- HDOJ1086 线段相交问题