我在DockWindow中有不同类型的QWidgets:
当我放大时,我需要使用相同的滚动条同时滚动所有这些。我知道两个解决方案:
最佳解决方案是什么?你知道任何scrollArea教程吗?
非常感谢
答案 0 :(得分:2)
我会尝试这样做,以便需要一致滚动的每个项目都在其自己的QScrollArea
内。然后我会将所有这些小部件放在一个小部件中,下面有QScrollBar
(和/或侧面,如果需要的话)。
将内部滚动窗口小部件之一指定为“主”,可能是绘图窗口小部件。然后执行以下操作:
QScrollArea
的水平滚动条策略设置为永不显示滚动条。QScrollArea
的{{1}}的{{1}}信号发送到一个插槽,用于将主窗口小部件的水平horizontalScrollBar()
设置为相同的范围。此外,它应为其他滚动区域窗口小部件的水平滚动条设置相同的范围。rangeChanged( int min, int max )
的{{1}}信号应连接到每个滚动区域小部件的水平滚动条的QScrollBar
插槽。有一个地方我认为这可能会出错,那就是鼠标滚轮滚动。你可以通过几种方式解决这个问题。一种方法是将所有滚动区域连接到一个插槽,当它们的值发生变化时触发,这会更新所有其他滚动条。另一种方法是在这些小部件上安装事件过滤器,并忽略滚动或使用主滚动条处理它。
答案 1 :(得分:0)
mRightScrollBar 是 QScrollBar , mAddressAreaLeft,mHexArea,mASCIIArea 是 QTextEdits < / em> 。 将所有已更改值的信号连接到公共插槽
connect(mRightScrollBar,&QScrollBar::valueChanged,this,&QHexWindow::handleScroll);
connect(mAddressAreaLeft->verticalScrollBar(),&QScrollBar::valueChanged,this,&QHexWindow::handleScroll);
connect(mHexArea->verticalScrollBar(),&QScrollBar::valueChanged,this,&QHexWindow::handleScroll);
connect(mASCIIArea->verticalScrollBar(),&QScrollBar::valueChanged,this,&QHexWindow::handleScroll);
handleScroll函数可以如下
void QHexWindow::handleScroll(int i)
{
QScrollBar *sender = qobject_cast<QScrollBar *>(this->sender());
if(sender == mAddressAreaLeft->verticalScrollBar())
{
mHexArea->verticalScrollBar()->blockSignals(true);
mASCIIArea->verticalScrollBar()->blockSignals(true);
mRightScrollBar->blockSignals(true);
mHexArea->verticalScrollBar()->setValue(i);
mASCIIArea->verticalScrollBar()->setValue(i);
mRightScrollBar->setValue(i);
mHexArea->verticalScrollBar()->blockSignals(false);
mASCIIArea->verticalScrollBar()->blockSignals(false);
mRightScrollBar->blockSignals(false);
}
else if(sender == mHexArea->verticalScrollBar())
{
mAddressAreaLeft->verticalScrollBar()->blockSignals(true);
mASCIIArea->verticalScrollBar()->blockSignals(true);
mRightScrollBar->blockSignals(true);
mAddressAreaLeft->verticalScrollBar()->setValue(i);
mASCIIArea->verticalScrollBar()->setValue(i);
mRightScrollBar->setValue(i);
mAddressAreaLeft->verticalScrollBar()->blockSignals(false);
mASCIIArea->verticalScrollBar()->blockSignals(false);
mRightScrollBar->blockSignals(false);
}
else if(sender == mASCIIArea->verticalScrollBar())
{
mAddressAreaLeft->verticalScrollBar()->blockSignals(true);
mHexArea->verticalScrollBar()->blockSignals(true);
mRightScrollBar->blockSignals(true);
mAddressAreaLeft->verticalScrollBar()->setValue(i);
mHexArea->verticalScrollBar()->setValue(i);
mRightScrollBar->setValue(i);
mAddressAreaLeft->verticalScrollBar()->blockSignals(false);
mHexArea->verticalScrollBar()->blockSignals(false);
mRightScrollBar->blockSignals(false);
}
else if(sender == mRightScrollBar)
{
mAddressAreaLeft->verticalScrollBar()->blockSignals(true);
mHexArea->verticalScrollBar()->blockSignals(true);
mASCIIArea->verticalScrollBar()->blockSignals(true);
mAddressAreaLeft->verticalScrollBar()->setValue(i);
mHexArea->verticalScrollBar()->setValue(i);
mASCIIArea->verticalScrollBar()->setValue(i);
mAddressAreaLeft->verticalScrollBar()->blockSignals(false);
mHexArea->verticalScrollBar()->blockSignals(false);
mASCIIArea->verticalScrollBar()->blockSignals(false);
}
update();
}