先说一下整体思路。页面布局两个widget然后再将定时器和按钮关联起来。
定时器发出信号的时候,随着信号,不断地重新设置widget的宽度,实现窗口的动态切换。
具体操作如下:
cpp
class QtWidgetsApplication4 : public QMainWindow
{
Q_OBJECT
//切换的状态标志位
enum class MoveActive
{
START,
MOVING,
FINISH
};
public:
QtWidgetsApplication4(QWidget *parent = Q_NULLPTR);
//决定是否显示右边的widget
void showWidget(bool isShow);
private:
Ui::QtWidgetsApplication4Class ui;
MoveActive m_status;
bool showOrNot;
QTimer * m_pTimer = nullptr;
};
具体函数实现如下
cpp
void QtWidgetsApplication4::showWidget(bool isShow)
{
showOrNot = isShow;
m_status = MoveActive::START;
m_pTimer->start(30);
}
cpp
//首先设置一下窗口的尺寸
int width = this->width();
this->setFixedWidth(180);
//初始状态只显示左边
ui.widget_2->setFixedWidth(0);
ui.widget_2->setVisible(false);
ui.widget->setFixedWidth(195);
ui.widget->setVisible(true);
connect(ui.pushButton, &QPushButton::clicked, [&] {
showWidget(true);
});
connect(ui.pushButton_2, &QPushButton::clicked, [&] {
showWidget(false);
});
m_pTimer = new QTimer(this);
connect(m_pTimer, &QTimer::timeout, [&] {
switch (m_status)
{
case QtWidgetsApplication4::MoveActive::START:
ui.widget->setVisible(true);
ui.widget_2->setVisible(true);
m_status = MoveActive::MOVING;
break;
case QtWidgetsApplication4::MoveActive::MOVING:
if (showOrNot)
{
int leftWidth = ui.widget->width();
leftWidth -= 10;
int rightWidth = ui.widget_2->width();
rightWidth += 10;
if (rightWidth >= 175|| leftWidth <= 10)
{
rightWidth = 175;
leftWidth = 0;
ui.widget->setFixedWidth(0);
ui.widget_2->setFixedWidth(175);
m_status = MoveActive::FINISH;
break;
}
ui.widget->setFixedWidth(leftWidth);
ui.widget_2->setFixedWidth(rightWidth);
}else {//左侧变宽,右侧变窄
int leftWidth = ui.widget->width();
int rightWidth = ui.widget_2->width();
leftWidth += 10;
rightWidth -= 10;
if (leftWidth>=175|| rightWidth <= 10)
{
leftWidth = 175;
rightWidth = 0;
ui.widget->setFixedWidth(175);
ui.widget_2->setFixedWidth(0);
m_status = MoveActive::FINISH;
break;
}
ui.widget->setFixedWidth(leftWidth);
ui.widget_2->setFixedWidth(rightWidth);
}
break;
case QtWidgetsApplication4::MoveActive::FINISH:
m_pTimer->stop();
break;
default:
break;
}
});