12

コンテンツが変更されたときの qt4 ウィジェットのサイズに問題があります。

2 つの単純なシナリオで問題を説明します。

シナリオ 1:

QLineEdit ウィジェットがあります。QLineEdit.setText() を使用してコンテンツを変更しているときに、1 行の文字列が現在のサイズではウィジェットに収まらないことがあります。すべてを表示するには、ウィジェットを選択し、矢印キーを使用して文字列を両方向にスクロールする必要があります。

シナリオ 2:

QTextEdit ウィジェットがあります。QTextEdit.setHtml() を使用してコンテンツを変更すると、レンダリングされた HTML コンテンツが現在のサイズではウィジェットに収まらないことがあります。ウィジェットは水平および/または垂直スクロール バーの表示を開始し、それらを使用して HTML コンテンツをスクロールできます。

このようなシナリオで私が望むのは、コンテンツの変更後に新しいコンテンツがウィジェットに収まらなくなり、すべてが収まるようにウィジェットのサイズを自動的に大きくするかどうかを決定するロジックを持つことです。

これらのシナリオはどのように処理されますか? 私はPyQt4を使用しています。

編集:コメントと最初の回答(ウィジェットへのコンテンツの入力について言及)の両方を読んだ後、もう一度質問を調べました。ひどいタイプミスを見つけて、不愉快な驚きを覚えました。QTextEdit を書いたとき、私は QTextBrowser を意味していました。誤解を招いてしまったことをお詫びします。つまり、変更中の HTML コードをレンダリングするウィジェットがあり、スクロールバーなしですべてを表示するのに十分なほどウィジェットを大きくしたいと考えています。

QLabel の代わりに QLineEdit について - マウスで QLabel からテキストを選択してコピーできないことに気付いたので、QLineEdit を選びました。QLineEdit を使えば可能です。

4

5 に答える 5

8

私が最もよく知っているのは C++ であり、問​​題は PyQt に固有のものではないため、ここでは C++ で回答しています。

通常、コンテンツが変更された可能性がある場合に呼び出す必要があるのと同じように、変更されQWidget::updateGeometry()た可能性がある場合に呼び出す必要があります。sizeHint()QWidget::update()

ただし、問題は、テキストがおよびsizeHint()に追加されても が変化しないことです。理由があります: 人々は自分のダイアログが入力するにつれて成長することを期待していません:)QLineEditQTextEdit

とは言っても、これらのウィジェットでタイプに応じて成長する動作が本当に必要な場合は、それらを継承して再実装sizeHint()し、minimumSizeHint()より大きなサイズを返す必要があります。setText()append()updateGeometry()

sizehint の計算は完全に自明というわけではなくQLineEdit、 for QTextEdit(密かに aです) よりも for の方がはるかに簡単ですが、との実装をQAbstractScrollArea参照してインスピレーションを得ることができます(これには、まさにあなたがしたことを行うモードがあります)。したい: .sizeHint()minimumSizeHint()QComboBoxQComboBox::AdjustToContents

EDIT:2つのユースケース(スクロールバーのないQTextBrowserと、QLabelの代わりにQLineEditでテキストを選択する)は、QLabelと最近の十分なQtを使用して解決できます。QLabel は、Qt 4.2 でリンククリック通知といわゆる「テキスト インタラクション フラグ」(その 1 つは TextSelectableByMouse) の両方を取得しました。私が確認できた唯一の違いは、新しいコンテンツのロードが自動ではないこと、履歴がないこと、そして QLabel にはマイクロ フォーカス ヒンティング (つまり、リンクからリンクへのタブ移動) がないことです。

于 2009-07-22T16:08:31.187 に答える
2

QTextBrowser の場合、次を使用してドキュメントのサイズを取得できるはずです

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

htmlを設定した後、その後QTextBrowserのサイズを変更します。

于 2009-07-27T13:49:41.863 に答える
1

次の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

textedit-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 )

于 2009-11-29T23:39:50.967 に答える
1

Python QT Automatic Widget Resizerを見てください。ただし、Python で書かれていますが、必要なことを行う方法についていくつかのアイデアが得られる場合があります。

于 2010-12-15T19:05:33.910 に答える
0

わかりましたメソッドを実装しsizeHint()ます。また、コンテンツがサイズを変更するたびに、サイズupdateGeometry() を変更せずにコンテンツが変更されたときに呼び出しますupdate()。(updateGeometry()自動的に呼び出しますupdate())。

于 2009-11-28T19:18:00.570 に答える