Qt - Есть ли ошибка в QPropertyAnimation? - PullRequest
0 голосов
/ 25 июля 2010

Я сталкиваюсь с очень серьезной ситуацией.Написав этот вопрос, я надеюсь, что действительно профессионалы выскажут свое мнение относительно проблемы, которую я собираюсь описать.Я сообщил об ошибке в https://bugreports.qt.io/:

Я создал QPropertyAnimation для свойства MaximumWidth в QTextEdit, и он не работает (он немедленно меняет состояние с начального состояния на конечное состояние),хотя это работает для свойства минимальной ширины.Пожалуйста, смотрите прикрепленный код.

И прикрепите файлы .h и .cpp.Смотрите эти файлы здесь (файлы называются new.h и new.cpp).

И я получил следующий ответ:

MaximumWidth - это не то свойство, которое вы хотите анимировать.Он содержит максимальную ширину, которую может иметь виджет, он связан с компоновкой и так далее.Изменение максимальной ширины (а также минимальной ширины) не обязательно вызывает ретрансляцию и перерисовку.Вы должны анимировать размер.

Пожалуйста, объясните мне, это ошибка или нет?Пожалуйста, скажите мне, как анимируется свойство MinimWith, но когда оно относится к свойству MaximumWidth, я не должен работать, и это нормально?Я просто не понимаю их точку зрения ... Пожалуйста, объясните.

PS Я написал этот код, потому что хотел анимацией закрыть правильный QTextEdit и быть уверенным, что при изменении размера главного окна, в котором находятся кнопка и два QTextEdit, закрытый QTextEdit не восстанавливается.

Ответы [ 4 ]

3 голосов
/ 25 июля 2010

Вы проверили фактическое значение MaximumWidth? Вы, кажется, не устанавливаете конкретную максимальную ширину в вашем коде.

Значение по умолчанию для MaximumWidth - 16777215, и вы устанавливаете длительность 1 мсек. для закрытия анимации. Исчезает с 16777215 до 3 в 1 мс. я думаю, будет выглядеть "мгновенно".

2 голосов
/ 25 июля 2010

Я не думаю, что это ошибка;Я бы назвал это «неопределенным поведением».Это означает, что если вы попытаетесь анимировать минимальную ширину, никто точно не скажет вам, что должно произойти, и, возможно, в коде есть некоторые оптимизации или угловые случаи, когда иногда это работает, в других - нет.

В любом случае, минимальная ширина и максимальная ширина не должны использоваться для определения размера QWidget, только того, что он не должен превышать;то есть они не предназначены для того, чтобы делать то, что вы пытаетесь сделать, поэтому это можно назвать ошибкой.Если вы хотите анимировать, вы должны использовать детерминистский подход, который в этом случае использует свойство geometry.

0 голосов
/ 25 июля 2010

Уважаемый Софхамстер! Я изменил свой код на код ниже, и он работает нормально. Спасибо за подсказку!

Заголовочный файл

class MyWidget : public QWidget
{

    Q_OBJECT

    QTextEdit       *m_textEditor1;
    QTextEdit       *m_textEditor2;
    QPushButton     *m_pushButton;
    QHBoxLayout     *m_layout;
    QVBoxLayout     *m_buttonLayout;

    int              m_deltaX;
    bool             m_isClosed;


public:

    MyWidget(QWidget * parent = 0);
    ~MyWidget(){}

    void resizeEvent( QResizeEvent * event );

private slots:
    void closeOrOpenTextEdit2(bool isClosing);

};

Исходный файл

MyWidget::MyWidget(QWidget * parent):QWidget(parent),m_deltaX(0)
{

  m_pushButton = new QPushButton(this);
  m_pushButton->setText(">");
  m_pushButton->setCheckable(true);
  m_pushButton->setFixedSize(16,16);
  connect(m_pushButton, SIGNAL(clicked(bool)), this, SLOT(closeOrOpenTextEdit2(bool)));

  m_textEditor1 = new QTextEdit(this);
  m_textEditor1->setText("AAAAA AAAAAAAAAAA AAAAAAAAAAA  AAAAAAA AAAAAAAAAAA AAAAAAAAAAA  AA");

  m_textEditor2 = new QTextEdit(this);

  m_buttonLayout = new QVBoxLayout();
  m_buttonLayout->addWidget(m_pushButton);
  m_buttonLayout->addItem( new QSpacerItem(1, 1, QSizePolicy::Minimum, QSizePolicy::Expanding) );


  m_layout = new QHBoxLayout;
  m_layout->addWidget(m_textEditor1, 10);
  m_layout->addSpacing(15);
  m_layout->addLayout(m_buttonLayout);
  m_layout->setSpacing(0);
  m_layout->addWidget(m_textEditor2, 4);

  setLayout(m_layout);
  resize(800,500);
}

void MyWidget::closeOrOpenTextEdit2(bool isClosing)
{
    m_isClosed = isClosing;
    QPropertyAnimation *animation1 = new QPropertyAnimation(m_textEditor2, "maximumWidth");

    if(isClosing) //close the second textEdit
    {
        m_textEditor2->setMaximumWidth(m_textEditor2->width());

        int textEdit2_start = m_textEditor2->maximumWidth();

        m_deltaX = textEdit2_start;
        int textEdit2_end = 3;



        animation1->setDuration(500);
        animation1->setStartValue(textEdit2_start);
        animation1->setEndValue(textEdit2_end);


        m_pushButton->setText("<");

    }
    else //open
    {


        int textEdit2_start = m_textEditor2->maximumWidth();
        int textEdit2_end = m_deltaX;


        animation1->setDuration(500);
        animation1->setStartValue(textEdit2_start);
        animation1->setEndValue(textEdit2_end);


        m_pushButton->setText(">");

    }

    animation1->start();

}


void MyWidget::resizeEvent( QResizeEvent * event )
{
    if(!m_isClosed)
        m_textEditor2->setMaximumWidth( QWIDGETSIZE_MAX );
}
0 голосов
/ 25 июля 2010

Это не ошибка, ответ, который вы получили из отчета об ошибке, довольно хорошо объясняет проблему с вашим кодом и решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...