小编Aar*_*ron的帖子

调整QT的QTextEdit大小以匹配文本高度:maximumViewportSize()

我试图在包含几个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()相同的东西.不幸的是,这不起作用,因为我仍然有同样的问题.

qt qtextedit

11
推荐指数
1
解决办法
1万
查看次数

模板化类中的C++模板成员变量具有不完整的类型

我在头文件中有类似以下的代码:

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来存储数据项.

我假设我的语法有点偏,所以任何帮助都会受到赞赏.

c++ templates

3
推荐指数
1
解决办法
4600
查看次数

标签 统计

c++ ×1

qt ×1

qtextedit ×1

templates ×1