同时滚动不同的小部件

时间:2009-12-30 23:02:18

标签: c++ qt qt4

我在DockWindow中有不同类型的QWidgets:

  • 1 Qwt plot
  • 1 QWidget
  • 3 QGraphicsView

当我放大时,我需要使用相同的滚动条同时滚动所有这些。我知道两个解决方案:

  • 创建一个滚动条并将其连接到每个小部件。
  • 创建一个scrollArea并操纵所有小部件。

最佳解决方案是什么?你知道任何scrollArea教程吗?

非常感谢

2 个答案:

答案 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();
}