// 窗口A .h
class WindowA : public QWidget
{
Q_OBJECT
public:
explicit WindowA(QWidget *parent = nullptr);
~WindowA();
protected:
void resizeEvent(QResizeEvent *event) override;
signals:
void sizeChanged(int width,int height);
private:
Ui::WindowA *ui;
};
//窗口A .cpp
WindowA::WindowA(QWidget *parent) :
QWidget(parent),
ui(new Ui::WindowA)
{
ui->setupUi(this);
}
WindowA::~WindowA()
{
delete ui;
}
void WindowA::resizeEvent(QResizeEvent *event)
{
int old_width = event->oldSize().width();
int new_width = event->size().width();
// 计算宽度的增长量
int width_change = new_width - old_width;
emit sizeChanged(this->width(),width_change);
QWidget::resizeEvent(event);
}
// 窗口B .h
class WindowB : public QWidget
{
Q_OBJECT
public:
explicit WindowB(QWidget *parent = nullptr);
~WindowB();
public slots:
void onSizeChanged(int width,int width_changge);
private:
Ui::WindowB *ui;
};
// 窗口B .cpp
WindowB::WindowB(QWidget *parent) :
QWidget(parent),
ui(new Ui::WindowB)
{
ui->setupUi(this);
}
WindowB::~WindowB()
{
delete ui;
}
void WindowB::onSizeChanged(int width,int width_changge)
{
this->move(this->pos().x()+width_changge,this->pos().y());
// 500是两个窗口的总宽度
resize(500-width,this->height());
}
// 主界面 .h
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::Widget *ui;
WindowA* wina;
WindowB* winb;
};
// 主界面 .cpp
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
wina = new WindowA();
wina->setWindowTitle("A");
winb = new WindowB();
winb->setWindowTitle("B");
connect(wina, &WindowA::sizeChanged, winb, &WindowB::onSizeChanged);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_pushButton_clicked()
{
wina->setGeometry(400,400,200,200);
wina->show();
}
void Widget::on_pushButton_2_clicked()
{
winb->setGeometry(600,400,200,200);
winb->show();
}
思路:当A调整宽度时,记录A的宽度变化,发信号给B窗口,
B窗口 (1)调整位置,(A变化多少,B就变化多少)(2)调整宽度, 宽度B = 总长-宽度A
1:QResizeEvent *event 有新旧两个坐标属性。 2: 2resizeEvent 何时触发? 从拉动宽度->松手的那一瞬间触发。 发送信号this->width()是最新的宽度,width_change是新旧宽度的变化量。