我试图在包含几个QT小部件的表单中使用QTextEdit小部件.表单本身位于QScrollArea内,该窗口是窗口的中心窗口小部件.我的意图是,任何必要的滚动都将在主QScrollArea中进行(而不是在任何小部件内部),并且内部的任何小部件将自动调整其高度以保存其内容.
我试图用QTextEdit实现高度的自动调整,但遇到了一个奇怪的问题.我创建了一个QTextEdit的子类,并重新实现了sizeHint(),如下所示:
QSize OperationEditor::sizeHint() const {
QSize sizehint = QTextBrowser::sizeHint();
sizehint.setHeight(this->fitted_height);
return sizehint;
}
Run Code Online (Sandbox Code Playgroud)
this-> fitted_height通过连接到QTextEdit的"contentsChanged()"信号的插槽保持最新:
void OperationEditor::fitHeightToDocument() {
this->document()->setTextWidth(this->viewport()->width());
QSize document_size(this->document()->size().toSize());
this->fitted_height = document_size.height();
this->updateGeometry();
}
Run Code Online (Sandbox Code Playgroud)
QTextEdit子类的大小策略是:
this->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
Run Code Online (Sandbox Code Playgroud)
这是我的问题:
随着QTextEdit逐渐调整大小以填充窗口,无论sizeHint()返回什么高度,它都会停止变大并开始在QTextEdit中滚动.如果我最初让sizeHint()返回一些大的常数,那么QTextEdit非常大,并且很好地包含在外部QScrollArea中,正如人们所期望的那样.但是,如果sizeHint逐渐调整QTextEdit的大小而不是仅仅让它开始变大,那么当它填充当前窗口并开始滚动而不是增长时,它会突然出现.
我已经跟踪过这个问题,无论我的sizeHint()返回什么,它都不会将QTextEdit的大小调整为大于从QAbstractScrollArea继承的maximumViewportSize()返回的值.请注意,这与viewport() - > maximumSize()的数量不同.我无法弄清楚如何设置该值.
查看QT的源代码,maximumViewportSize()返回"视口的大小,好像滚动条没有有效的滚动范围".此值基本上计算为窗口小部件的当前大小减去(2*frameWidth +边距)加上任何滚动条宽度/高度.这对我来说没有多大意义,而且我不清楚为什么这个数字会以某种方式用于取代子类的sizeHint()实现.而且,单个"frameWidth"整数用于计算宽度和高度似乎很奇怪.
任何人都可以对此有所了解吗?我怀疑我对QT布局引擎的不了解是这里的责任.
编辑:在最初发布之后,我有想法重新实现maximumViewportSize()以返回与sizeHint()相同的东西.不幸的是,这不起作用,因为我仍然有同样的问题.
我在头文件中有类似以下的代码:
template<class A>
class List {
private:
QVector<A> _list;
};
Run Code Online (Sandbox Code Playgroud)
其中QVector是标准的QT容器.
当我尝试在另一个头文件中创建List类型的变量作为成员变量时,如下所示:
class Model {
private:
List<int *> the_list;
};
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
In instantiation of 'List<int *>':
instantiated from here
error: 'List<A>::_list' has incomplete type
Run Code Online (Sandbox Code Playgroud)
基本上,我想要一个模板化的自定义列表,它使用内部QVector来存储数据项.
我假设我的语法有点偏,所以任何帮助都会受到赞赏.