0

我有 Qt C++ 相关的问题。我需要将窗口分成 4 个部分。其中 3 个应该是 QTableWidgets(示例图片上的红色、黄色和绿色区域),但它们必须成对同步(红色和黄色、红色和绿色 - 一个的线条延续另一个的线条)所以当你水平滚动红色 QTableWidget - 同时水平滚动绿色 QTableWidget(反之亦然),并且垂直滚动红色 QTableWidget - 同时垂直滚动黄色 QTableWidget(反之亦然)。此外,我需要有可能调整拖动边框的区域大小(图片上的灰色箭头)。因此,当我拖动每个边框时 - 它会更改 2 个相应 QTableWidgets 的大小。

我很高兴知道如何实现这一点。预先感谢!

例子

4

1 回答 1

0

重现您的图像的最小示例:

#include <QApplication>
#include <QTableWidget>
#include <QSplitter>
#include <QHBoxLayout>
#include <QScrollBar>
#include <QHeaderView>
#include <QTimer>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //////////////////////////////////////////////////////////////////////////
    /// Things you can do in Qt Designer
    QWidget mainW;
    QSplitter *hSplitter = new QSplitter(Qt::Horizontal,&mainW);
    QSplitter *vSplitter1 = new QSplitter(Qt::Vertical,&mainW);
    QSplitter *vSplitter2 = new QSplitter(Qt::Vertical,&mainW);
    QTableWidget *tableRed = new QTableWidget(6,6,&mainW);
    tableRed->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    tableRed->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    tableRed->verticalHeader()->hide();
    tableRed->horizontalHeader()->hide();
    QTableWidget *tableGreen = new QTableWidget(1,6,&mainW);
    tableGreen->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    tableGreen->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    tableGreen->verticalHeader()->hide();
    tableGreen->horizontalHeader()->hide();
    QTableWidget *tableYellow = new QTableWidget(6,2,&mainW);
    tableYellow->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    tableYellow->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    tableYellow->verticalHeader()->hide();
    tableYellow->horizontalHeader()->hide();
    QWidget *topLeft = new QWidget(&mainW);
    vSplitter1->addWidget(topLeft);
    vSplitter1->addWidget(tableYellow);
    vSplitter2->addWidget(tableGreen);
    vSplitter2->addWidget(tableRed);
    hSplitter->addWidget(vSplitter1);
    hSplitter->addWidget(vSplitter2);
    QHBoxLayout *mainLay = new QHBoxLayout(&mainW);
    mainLay->addWidget(hSplitter);
    //////////////////////////////////////////////////////////////////////////
    QTimer::singleShot(0,vSplitter1,[vSplitter2,vSplitter1](){vSplitter1->setSizes(vSplitter2->sizes());});
    QObject::connect(vSplitter1,&QSplitter::splitterMoved,vSplitter2,[vSplitter2,vSplitter1](){vSplitter2->setSizes(vSplitter1->sizes());});
    QObject::connect(vSplitter2,&QSplitter::splitterMoved,vSplitter1,[vSplitter2,vSplitter1](){vSplitter1->setSizes(vSplitter2->sizes());});
    QObject::connect(tableRed->verticalScrollBar(),&QScrollBar::valueChanged,tableYellow->verticalScrollBar(),&QScrollBar::setValue);
    QObject::connect(tableYellow->verticalScrollBar(),&QScrollBar::valueChanged,tableRed->verticalScrollBar(),&QScrollBar::setValue);
    QObject::connect(tableRed->horizontalScrollBar(),&QScrollBar::valueChanged,tableGreen->horizontalScrollBar(),&QScrollBar::setValue);
    QObject::connect(tableGreen->horizontalScrollBar(),&QScrollBar::valueChanged,tableRed->horizontalScrollBar(),&QScrollBar::setValue);
    mainW.show();
    return a.exec();
}
于 2021-11-12T11:23:52.513 回答