【问题标题】:Scrolling different Widgets at the same time同时滚动不同的小部件
【发布时间】:2020-03-17 01:57:13
【问题描述】:

我将不同类型的 QWidgets 放入 DockWindow:

  • 1 Qwt 图
  • 1 个 QWidget
  • 3 QGraphicsView

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

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

解决这个问题的最佳方法是什么?你知道scrollArea教程吗?

非常感谢

【问题讨论】:

    标签: c++ qt qt4


    【解决方案1】:

    我会尝试使需要一起滚动的每个项目都在其自己的QScrollArea 内。然后,我会将所有这些小部件放入一个小部件中,并在下方(和/或侧面,如果需要)使用 QScrollBar

    将内部滚动小部件之一指定为“主”,可能是绘图小部件。然后执行以下操作:

    • 将每个QScrollArea 的水平滚动条策略设置为从不显示滚动条。
    • QScrollAreahorizontalScrollBar()rangeChanged( int min, int max ) 向一个槽发出信号,该槽将主窗口部件的水平QScrollBar 设置为相同的范围。此外,它应该为其他滚动区域小部件的水平滚动条设置相同的范围。
    • 水平的QScrollBarvalueChanged( int value ) 信号应该连接到每个滚动区域小部件的水平滚动条的setValue( int value ) 插槽。
    • 如果进行垂直滚动,则重复垂直滚动条。

    我认为有一个地方可能会出错,那就是鼠标滚轮滚动。你可以通过几种方式解决这个问题。一种方法是将所有滚动区域连接到一个插槽,该插槽在其值更改时触发,从而更新所有其他滚动条。另一种方法是在这些小部件上安装事件过滤器,然后忽略滚动或使用主滚动条对其进行处理。

    【讨论】:

      【解决方案2】:

      mRightScrollBarQScrollBarmAddressAreaLeft, mHexArea, mASCIIAreaQTextEdits。 将所有 valuechanged 信号连接到一个公共插槽

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-01
        • 2021-03-22
        • 2018-08-08
        • 2020-10-24
        • 1970-01-01
        • 2019-05-23
        • 2019-11-30
        • 2020-07-27
        相关资源
        最近更新 更多