我有一个 Qt 小部件,有四个分区,用拆分器分隔。 最顶层是一个垂直分割器,改变两个水平分割器topSplitter和bottomSplitter的高度。
如何保持两个水平分离器的位置相等,就好像它只是一个水平分离器一样? 我查看了 splitterMoved 的链接信号,并将其连接到另一个拆分器上的插槽,但拆分器类中没有等效的插槽。
这显然必须避免无限循环的问题,即一个分离器的位置更新第二个分离器,第二个分离器更新第一个分离器。
最佳答案
这非常简单。初始化(splitter1
和splitter2
是需要同步的splitter):
connect(ui->splitter1, SIGNAL(splitterMoved(int,int)), this, SLOT(splitterMoved()));
connect(ui->splitter2, SIGNAL(splitterMoved(int,int)), this, SLOT(splitterMoved()));
插槽:
void MainWindow::splitterMoved() {
QSplitter* senderSplitter = static_cast<QSplitter*>(sender());
QSplitter* receiverSplitter = senderSplitter == ui->splitter1 ?
ui->splitter2 : ui->splitter1;
receiverSplitter->blockSignals(true);
receiverSplitter->setSizes(senderSplitter->sizes());
receiverSplitter->blockSignals(false);
}
blockSignals
确保调用不会无限递归。实际上,setSizes
不会导致发出 splitterMoved
,因此您可以删除两个 blockSigals
调用,代码仍然可以工作。但是,文档中没有对此进行说明,因此我不会依赖它。
关于qt - 如何保持两个并行 Qsplitter 大小相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22325041/