PyQt的:如何处理小部件自动调整大小时,其含量的变化(PyQt: how to handle au

2019-07-30 11:27发布

我有当QT4小部件的内容变化的大小一些问题。

我将举例说明有两个简单的场景我的问题:

方案1:

我有一个QLineEdit的部件。 有时,当我改变了使用QLineEdit.setText()的内容,单行字符串不适合其当前大小的小部件了。 我必须选择窗口小部件并使用箭头键滚动串在两个方向上才能看到这一切。

方案2:

我有一个QTextEdit构件。 有时,当我使用QTextEdit.setHtml()改变其内容,呈现的HTML内容不适合在其目前的规模小部件了。 窗口小部件开始显示水平和/或垂直滚动​​条,我可以用它们来滚动HTML内容。

我想在这样的情况下是有决定是否内容变更后,新的内容将不再适合窗口小部件并自动增加小部件的大小,所以一切将适合一些逻辑。

这些方案是如何处理的? 我使用PyQt4的。

编辑:阅读都注释和第一个答案(其中提到键入内容到小工具)后,我去了这个问题一个更多的时间。 我感到不高兴,找出一个可怕的错字。 我的意思QTextBrowser当我写的QTextEdit,我的道歉误导你。 那就是:我有这使得我自己在改变,我想小部件种植足够,无需滚动条来显示所有HTML代码的小部件。

至于QLineEdit的,而不是QLabel - 我去了QLineEdit的,因为我发现我不能将它复制用鼠标选择从QLabel文字。 随着QLineEdit的是可能的。

Answer 1:

我回答在C ++这里,因为这是我最熟悉了,你的问题不是特定于PyQt的。

通常情况下,你只需要调用QWidget::updateGeometry()时, sizeHint()可能已经改变,就像你需要调用QWidget::update()时,内容可能已经改变。

您的问题,然而,就是在sizeHint()时,文本被添加到不改变QLineEditQTextEdit 。 是有原因的:人们不希望他们的对话成长,因为 - 他们式:)

也就是说,如果你真的想长大,作为你型在那些你需要从他们继承并重新实现小工具的行为sizeHint()minimumSizeHint()返回更大的尺寸,和潜在setText() append()等。调用updateGeometry()这样的sizehint变化注意到。

该sizehint计算将不完全微不足道的,而将是比较容易的方式QLineEditQTextEdit (这是暗暗QAbstractScrollArea ),但你可以看看sizeHint()minimumSizeHint()为灵感的实现(也是一个QComboBox ,其中有一个模式做的正是你想要的: QComboBox::AdjustToContents

编辑:您的两个usecases(QTextBrowser W / O滚动条和QLineEdit的,而不是QLabel的只是选择在那里文本)可以通过使用一个QLabel和最近的足够的Qt来解决。 QLabel已经获得了两个链接单击通知和所谓的“文本交互标志”(其中一个是TextSelectableByMouse)在Qt的4.2。 我能够做的唯一的区别是,加载新的内容不是自动的,没有历史,没有微焦点提示(即从一个链接跳格链接)的QLabel。



Answer 2:

对于QTextBrowser情况下,你应该能够使用以获取文档的大小

QTextBrowser::document()->size();

后设置的HTML,然后事后调整它的QTextBrowser。



Answer 3:

也许看看Python的QT自动控件调整器 。 它是用Python编写的,虽然,但它可能给你如何去这样做,你需要什么了。



Answer 4:

我实现通过使用以下C ++类类似的效果:

textedit.h

#ifndef TEXTEDIT_H
#define TEXTEDIT_H

#include <QTextEdit>

class TextEdit : public QTextEdit
{
  Q_DISABLE_COPY( TextEdit )

public:
  TextEdit( QWidget* parent = NULL );
  TextEdit( const QString& text, QWidget* parent = NULL );
  virtual ~TextEdit();

  void fitToDocument( Qt::Orientations orientations );
  virtual QSize sizeHint() const;

private:
  int fittedHeight_;
  Qt::Orientations fittedOrientations_;
  int fittedWidth_;
};

#include "textedit-inl.h"

#endif // TEXTEDIT_H

文字编辑,inl.h

#ifndef TEXTEDITINL_H
#define TEXTEDITINL_H

#include "textedit.h"

inline TextEdit::TextEdit( QWidget* parent ) :
    QTextEdit( parent ), fittedOrientations_( 0 )
{ }

inline TextEdit::TextEdit( const QString& text, QWidget* parent ) :
    QTextEdit( text, parent ), fittedOrientations_( 0 )
{ }

inline TextEdit::~TextEdit()
{ }

inline QSize TextEdit::sizeHint() const
{
  QSize sizeHint = QTextEdit::sizeHint();
  if( fittedOrientations_ & Qt::Horizontal )
    sizeHint.setWidth( fittedWidth_ );
  if( fittedOrientations_ & Qt::Vertical )
    sizeHint.setHeight( fittedHeight_ );
  return sizeHint;
}

#endif // TEXTEDITINL_H

textedit.cpp

#include "textedit.h"

void TextEdit::fitToDocument( Qt::Orientations orientations )
{
  QSize documentSize( document()->size().toSize() );
  QSizePolicy sizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred );
  if( orientations & Qt::Horizontal ) {
    fittedWidth_ = documentSize.width() + (width() - viewport()->width());
    sizePolicy.setHorizontalPolicy( QSizePolicy::Fixed );
  }
  if( orientations & Qt::Vertical ) {
    fittedHeight_ = documentSize.height() + (width() - viewport()->width());
    sizePolicy.setVerticalPolicy( QSizePolicy::Fixed );
  }
  fittedOrientations_ = orientations;
  setSizePolicy( sizePolicy );
  updateGeometry();
}

例如,调用TextEdit::fitToDocument( Qt::Horizontal )将小工具的宽度设置为一个固定的宽度恰好足够大,以适应文档及其周边地区(如垂直滚动条,如果有的话)。 如果你的目标是有这种情况发生,每当内容变化时,连接QTextEdit::textChanged()信号,其中要求插槽TextEdit::fitToDocument()

作为与您的问题QLabel ,解决方法很简单:调用QLabel::setTextInteractionFlags( Qt::LinksAccessibleByMouse | Qt::TextSelectableByMouse )



Answer 5:

好实现sizeHint()方法。 而每一次你的内容改变大小调用updateGeometry()当内容变化不改变大小使用update() 。 ( updateGeometry()自动调用update() )。



文章来源: PyQt: how to handle auto-resize of widgets when their content changes