PyQt: как обработать, автоизменяют размеры виджетов, когда их содержание изменяется

Из вашего примера кода выглядит, что Array.prototype.find - это то, что вы ищете: Array.prototype.find () и Array.prototype.findIndex ()

[1, 2, 3].find(function(el) {
    return el === 2;
}); // returns 2

11
задан 22 July 2009 в 16:32
поделиться

4 ответа

Для случая QTextBrowser вы должны иметь возможность получить размер документа, используя

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

после установки html, а затем изменить его размер QTextBrowser впоследствии.

2
ответ дан 3 December 2019 в 08:56
поделиться

Джон, проблема в том, что ваш запрос построен так, что он выбирает из производной таблицы. Производная таблица не может получить выгоду от ваших индексов. Попробуйте обновить свой запрос следующим образом:

SELECT
  Parts.*,
  Image.type, Image.width, Image.height,
  Location_State.name AS state,
  Location_Region.name AS region,
  Promotion.start_date AS promotion_start_date,
  Promotion.end_date AS promotion_end_date
FROM Parts
LEFT JOIN Image ON Parts.image_id = Image.id
LEFT JOIN Location_State ON Parts.state_id = Location_State.id
LEFT JOIN Location_Region ON Parts.state_id = Location_Region.id
LEFT JOIN Promotion ON Parts.promotion_id = Promotion.id
INNER JOIN Parts_Category ON (Parts_Category.category_id = 40 OR Parts_Category.main_category_id = 40)
WHERE Parts.status = 'A'
GROUP BY Parts.id
ORDER BY Parts.level DESC, Parts.warehouse DESC, Parts.updated DESC LIMIT 0, 15

Обратите внимание: если вам не нужны LEFT JOIN для таблиц Location_State, Location_Region, Promotion, используйте вместо этого INNER JOIN. Скорее всего, он будет работать лучше.

Чтобы еще больше помочь в оптимизации этого запроса, предоставьте следующее: заключается в том, что sizeHint () не изменяется при добавлении текста в QLineEdit и QTextEdit . По какой-то причине: люди не ожидают, что их диалоги будут расти по мере того, как они набирают:)

Тем не менее, если вы действительно хотите, чтобы поведение этих виджетов росло по мере того, как вы печатали, вам нужно унаследовать от них и повторно реализовать sizeHint () и minimumSizeHint () , чтобы вернуть больший размер, и потенциально setText () , append () и т. Д. Для вызова updateGeometry () , чтобы было замечено изменение sizehint.

Расчет sizehint не будет совсем тривиальным и будет намного проще для QLineEdit , чем для QTextEdit ] (который тайно является QAbstractScrollArea ), AdjustToContents .

РЕДАКТИРОВАТЬ: ваши два варианта использования (QTextBrowser без полос прокрутки и QLineEdit вместо QLabel только для выделения текста) могут быть решены с помощью QLabel и достаточно свежей версии Qt. QLabel получил как уведомление о щелчке по ссылке, так и так называемые «флаги текстового взаимодействия» (один из которых - TextSelectableByMouse) в Qt 4.2. Единственное отличие, которое я смог различить, заключается в том, что загрузка нового контента не происходит автоматически, нет истории и нет подсказок по микро фокусу (то есть переход от ссылки к ссылке) в QLabel.

AdjustToContents .

РЕДАКТИРОВАТЬ: ваши два варианта использования (QTextBrowser без полос прокрутки и QLineEdit вместо QLabel только для выбора текста) могут быть решены с помощью QLabel и достаточно свежей версии Qt. QLabel получил как уведомление о щелчке по ссылке, так и так называемые «флаги текстового взаимодействия» (один из которых - TextSelectableByMouse) в Qt 4.2. Единственное отличие, которое я смог различить, заключается в том, что загрузка нового контента не происходит автоматически, нет истории и нет подсказок по микро фокусу (то есть переход от ссылки к ссылке) в QLabel.

(одним из которых является TextSelectableByMouse) в Qt 4.2. Единственное отличие, которое я смог различить, заключается в том, что загрузка нового контента не происходит автоматически, нет истории и нет подсказок по микро фокусу (то есть переход от ссылки к ссылке) в QLabel.

(одним из которых является TextSelectableByMouse) в Qt 4.2. Единственное отличие, которое я смог различить, заключается в том, что загрузка нового контента не происходит автоматически, нет истории и нет подсказок по микро фокусу (то есть переход от ссылки к ссылке) в QLabel.

8
ответ дан 3 December 2019 в 08:56
поделиться

Я добиваюсь аналогичного эффекта, используя следующий класс 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) .

1
ответ дан 3 December 2019 в 08:56
поделиться

Хорошо, реализуйте метод sizeHint () . И каждый раз, когда размер вашего контента изменяется, вызывайте updateGeometry () При изменении содержимого без изменения размера используйте update () . ( updateGeometry () автоматически вызывает update () ).

0
ответ дан 3 December 2019 в 08:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: