Qt 如何保持两个平行的QSplitter大小相等?
我有一个Qt小部件,有四个分区,用拆分器隔开。 顶层是一个垂直拆分器,可改变两个水平拆分器(上拆分器和下拆分器)的高度 如何保持两个水平拆分器的位置相等,就好像它只是一个水平拆分器一样? 我查看了splitterMoved的链接信号,并将其连接到另一个拆分器上的插槽,但在拆分器类中没有等效的插槽Qt 如何保持两个平行的QSplitter大小相等?,qt,layout,signals-slots,Qt,Layout,Signals Slots,我有一个Qt小部件,有四个分区,用拆分器隔开。 顶层是一个垂直拆分器,可改变两个水平拆分器(上拆分器和下拆分器)的高度 如何保持两个水平拆分器的位置相等,就好像它只是一个水平拆分器一样? 我查看了splitterMoved的链接信号,并将其连接到另一个拆分器上的插槽,但在拆分器类中没有等效的插槽 这显然必须避免出现无限循环的问题,其中一个拆分器的位置更新了第二个拆分器的位置,而第二个拆分器的位置更新了第一个拆分器。在包含的小部件中,您可以创建插槽以连接到splitterMoved信号 每个拆分器
这显然必须避免出现无限循环的问题,其中一个拆分器的位置更新了第二个拆分器的位置,而第二个拆分器的位置更新了第一个拆分器。在包含的小部件中,您可以创建插槽以连接到splitterMoved信号 每个拆分器需要一个插槽,需要检查拆分器的大小是否正确(以避免无限循环),然后根据需要更新大小 我只包括一个示例插槽和连接,但每个需要链接的拆分器都需要一个。 将以下内容放入新插槽以更新拆分器位置
QList<int> OtherSize,Current;
OtherSize=topSplitter->sizes();
Current=bottomSplitter->sizes();
if(OtherSize!=Current)
{
bottomSplitter->setSizes(OtherSize);
}
忽略信号提供的位置和索引是安全的,因为我们在此插槽中以不同的方式检查大小
这将设置所有尺寸,以便所有拆分条都匹配位置。
如果只有两个,则无所谓,但如果有两个以上,则在移动任何条时,所有条都将更新以匹配。在包含的小部件中,您可以创建插槽以连接到splitterMoved信号 每个拆分器需要一个插槽,需要检查拆分器的大小是否正确(以避免无限循环),然后根据需要更新大小 我只包括一个示例插槽和连接,但每个需要链接的拆分器都需要一个。 将以下内容放入新插槽以更新拆分器位置
QList<int> OtherSize,Current;
OtherSize=topSplitter->sizes();
Current=bottomSplitter->sizes();
if(OtherSize!=Current)
{
bottomSplitter->setSizes(OtherSize);
}
忽略信号提供的位置和索引是安全的,因为我们在此插槽中以不同的方式检查大小
这将设置所有尺寸,以便所有拆分条都匹配位置。
如果只有两个,则无所谓,但如果有两个以上,则在移动任何条时,所有条都将更新以匹配。在包含的小部件中,您可以创建插槽以连接到splitterMoved信号 每个拆分器需要一个插槽,需要检查拆分器的大小是否正确(以避免无限循环),然后根据需要更新大小 我只包括一个示例插槽和连接,但每个需要链接的拆分器都需要一个。 将以下内容放入新插槽以更新拆分器位置
QList<int> OtherSize,Current;
OtherSize=topSplitter->sizes();
Current=bottomSplitter->sizes();
if(OtherSize!=Current)
{
bottomSplitter->setSizes(OtherSize);
}
忽略信号提供的位置和索引是安全的,因为我们在此插槽中以不同的方式检查大小
这将设置所有尺寸,以便所有拆分条都匹配位置。
如果只有两个,则无所谓,但如果有两个以上,则在移动任何条时,所有条都将更新以匹配。在包含的小部件中,您可以创建插槽以连接到splitterMoved信号 每个拆分器需要一个插槽,需要检查拆分器的大小是否正确(以避免无限循环),然后根据需要更新大小 我只包括一个示例插槽和连接,但每个需要链接的拆分器都需要一个。 将以下内容放入新插槽以更新拆分器位置
QList<int> OtherSize,Current;
OtherSize=topSplitter->sizes();
Current=bottomSplitter->sizes();
if(OtherSize!=Current)
{
bottomSplitter->setSizes(OtherSize);
}
忽略信号提供的位置和索引是安全的,因为我们在此插槽中以不同的方式检查大小
这将设置所有尺寸,以便所有拆分条都匹配位置。
如果只有两个,那没关系,但是如果有两个以上,当任何一个条被移动时,所有条都会被更新以匹配。这很简单。初始化(
splitter1
和splitter2
是需要同步的拆分器):
插槽:
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);
}
void主窗口::splitterMoved(){
QSplitter*senderSplitter=static_cast(sender());
QSplitter*receiverSplitter=senderSplitter==ui->splitter1?
ui->splitter2:ui->splitter1;
接收器拆分器->块信号(真);
接收器拆分器->设置大小(发送器拆分器->大小();
接收器拆分器->块信号(假);
}
blockSignals
确保调用不会进入无限递归。实际上,setSizes
不会导致发出splitterMoved
,因此您可以删除这两个blockSigals
调用,代码仍然可以工作。但是,文档中没有关于这一点的注释,因此我不会依赖它。这非常简单。初始化(splitter1
和splitter2
是需要同步的拆分器):
插槽:
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);
}
void主窗口::splitterMoved(){
QSplitter*senderSplitter=static_cast(sender());
QSplitter*receiverSplitter=senderSplitter==ui->splitter1?
ui->splitter2:ui->splitter1;
接收器拆分器->块信号(真);
接收器拆分器->设置大小(发送器拆分器->大小();
接收器拆分器->块信号(假);
}
blockSignals
确保调用不会进入无限递归。实际上,setSizes
不会导致发出splitterMoved
,因此您可以删除这两个blockSigals
调用,代码仍然可以工作。但是,文档中没有关于这一点的注释,因此我不会依赖它。这非常简单。初始化(splitter1
和splitter2
是需要同步的拆分器):
插槽:
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);
}
void主窗口::splitterMoved(){
QSplitter*senderSplitter=static_cast(sender());
QSplitter*receiverSplitter=senderSplitter==ui->splitter1?
用户界面->拆分