【问题标题】:QSplitter in two directions两个方向的QSplitter
【发布时间】:2015-12-10 13:11:27
【问题描述】:

我想制作一个包含四个可使用 QSplitter 调整大小的小部件的应用。在这个应用程序中,我希望在调整拆分器大小时调整所有四个小部件的大小。我通过让水平分离器包含两个垂直分离器来实现这一点。然而,这种方式垂直分割只涉及两个小部件,而不是全部四个。有没有办法解决这种“矩阵”分裂?

【问题讨论】:

    标签: qt qsplitter


    【解决方案1】:

    您是否尝试过将一个的splitterMoved(int,int) 信号连接到另一个的moveSplitter(int,int) 插槽?

    QObject::connect(ui->upperSplitter, SIGNAL(splitterMoved(int,int), ui->lowerSplitter, SLOT(moveSplitter(int,int));
    QObject::connect(ui->lowerSplitter, SIGNAL(splitterMoved(int,int), ui->upperSplitter, SLOT(moveSplitter(int,int));
    

    http://doc.qt.io/qt-5/qsplitter.html#splitterMoved

    http://doc.qt.io/qt-5/qsplitter.html#moveSplitter

    或者您可能需要查看 QSplitterHandle 类。

    http://doc.qt.io/qt-5/qsplitterhandle.html

    希望对您有所帮助。

    【讨论】:

    • 希望这不会导致循环信号……但这是个好主意。
    • 不幸的是 moveSplitter 不是插槽,因此您编写的行不起作用。无论如何,您可以创建自己的插槽并在那里调用 moveSplitter
    【解决方案2】:

    另一个答案的另一种可能性是手动布局,在四个小部件的交叉处使用一个花哨的单个调整大小手柄。

    应该通过几行代码使用鼠标事件和 setGeometry 调用来完成。

    像这样(工作示例):

    (只需添加一个绘制事件即可在中心绘制一个您喜欢的手柄)

    该死的 .. 显然这是按钮标签的复制粘贴错误; ) 我更正了代码...

    FourWaySplitter::FourWaySplitter(QWidget *parent) :
       QWidget(parent),
       ui(new Ui::FourWaySplitter), m_margin(5)
    {
       ui->setupUi(this);
    
       m_ul = new QPushButton("Upper Left", this);
       m_ur = new QPushButton("Upper Right", this);
       m_ll = new QPushButton("Lower Left", this);
       m_lr = new QPushButton("Lower Right", this);
    
       setFixedWidth(500);
       setFixedHeight(400);
    
       // of course, the following needs to be updated in a sensible manner
       // when 'this' is not of fixed size in the 'resizeEvent(QResizeEvent*)' handler
       m_handleCenter = rect().center();
    
       m_ul->setGeometry(QRect(QPoint(m_margin,m_margin), m_handleCenter - QPoint(m_margin, m_margin)));
       m_ur->setGeometry(QRect(QPoint(width()/2 + m_margin, m_margin), QPoint(width() - m_margin, height()/2 - m_margin)));
       m_ll->setGeometry(QRect(QPoint(m_margin, height()/2 + m_margin), QPoint(width()/2 - m_margin, height() - m_margin)));
       m_lr->setGeometry(QRect(QPoint(width()/2 + m_margin, height()/2 + m_margin), QPoint(width() - m_margin, height() - m_margin)));
    }
    
    void FourWaySplitter::mouseMoveEvent(QMouseEvent * e)
    {
       if(m_mouseMove) {
          QRect newGeo = m_ul->geometry();
          newGeo.setBottomRight(e->pos() + QPoint(-m_margin, -m_margin));
          m_ul->setGeometry(newGeo);
    
          newGeo = m_ur->geometry();
          newGeo.setBottomLeft(e->pos() + QPoint(+m_margin, -m_margin));
          m_ur->setGeometry(newGeo);
    
          newGeo = m_ll->geometry();
          newGeo.setTopRight(e->pos() + QPoint(-m_margin, + m_margin));
          m_ll->setGeometry(newGeo);
    
          newGeo = m_lr->geometry();
          newGeo.setTopLeft(e->pos() + QPoint(+m_margin, + m_margin));
          m_lr->setGeometry(newGeo);
       }
    }
    
    void FourWaySplitter::mousePressEvent(QMouseEvent * e)
    {
       if((e->pos() - m_handleCenter).manhattanLength() < 10) {
          m_mouseMove = true;
       }
    }
    
    void FourWaySplitter::mouseReleaseEvent(QMouseEvent * e)
    {
       m_handleCenter = rect().center();
       m_mouseMove    = false;
    }
    
    FourWaySplitter::~FourWaySplitter()
    {
       delete ui;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多