2015-12-10 6 views
0

Я хочу создать приложение, которое включает в себя четыре виджета, которые изменяются по размеру с помощью QSplitter. В этом приложении я бы хотел, чтобы все четыре виджета изменялись при изменении размера разделителя. Я понял это, имея горизонтальный сплиттер, содержащий два вертикальных разветвителя. Таким образом, вертикальное разделение касается только двух виджетах и ​​не всех четырех. Есть ли способ расщепления этой «матрицы»?QSplitter в двух направлениях

ответ

2

Вы пробовали подключить сигнал 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

Надежда, что помогает.

+0

Надеюсь, что это не вызывает круговую сигнализации .. но хорошая идея. – Aaron

1

Другая возможность для другого ответа - это макет макета с причудливой ручкой изменения размера в пересечении четырех виджетов.

Необходимо выполнить пару строк кода, используя события мыши и вызовы setGeometry.

Как это (рабочий пример):

(просто добавить событие рисования, чтобы нарисовать ручку в центре, как вам нравится)

Черт .. очевидно, была ошибка copy'n'paste с ярлыками кнопок;) Я скорректированный фиксированный код ...

enter image description here

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; 
} 
Смежные вопросы