Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Dmitry от Сентябрь 03, 2016, 22:50



Название: qpropertyanimation with splitter
Отправлено: Dmitry от Сентябрь 03, 2016, 22:50
Здравствуйте.
Есть форма. На ней два фиджета (левый и правый), разделенных сплиттером. И кнопочка, по которой правый виджет должен прятаться или раскрываться. Также ширину правого виджета можно менать сплиттером.
Раскрываться виджет должен до заданной ширины, но он раскрывается до той ширины, которая была при скрытии.

Привожу код

MyWidget.h
Код:

#ifndef QT_MYWIDGET_H
#define QT_MYWIDGET_H

#include <QtWidgets/QMainWindow>
#include <QPropertyAnimation>
#include <QtWidgets/QTextEdit>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QSplitter>

class MyWidget : public QWidget
{

Q_OBJECT

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

int              m_deltaX;
bool             m_isClosed;


public:

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

void resizeEvent(QResizeEvent * event);

private slots:
void closeOrOpenTextEdit2(bool isClosing);

};

#endif //QT_MYWIDGET_H

MyWidget.cpp
Цитировать

#include <QPushButton>
#include <QtWidgets/QSplitter>
#include "MyWidget.h"

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_textEditor1->setMinimumWidth(150);

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

   splitter = new QSplitter();
   splitter->setObjectName(QStringLiteral("splitter"));
   splitter->setOrientation(Qt::Horizontal);
   splitter->addWidget(m_textEditor1);
   splitter->addWidget(m_textEditor2);

   m_layout = new QHBoxLayout;
   m_layout->addLayout(m_buttonLayout);
   m_layout->setSpacing(10);
   m_layout->addWidget(splitter);
   
   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
   {
       QRect rect = m_textEditor2->geometry();
       QList<int> sz = splitter->sizes();
       m_textEditor2->setMaximumWidth(500);

       int textEdit2_start = m_textEditor2->width();// 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 = 600;// 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);
}

Что я делаю не так ?