Как применить TableView :: SizeHint в QHBoxLayout? - PullRequest
0 голосов
/ 21 марта 2020

Я хочу создать 2 таблицы с QGraphicsView рядом с ним:

Expected outcome

Ширина таблицы по умолчанию определена в TableView::sizeHint. И QGraphicsView должен просто расширяться, чтобы заполнить оставшееся пространство. ScenRect QGraphicScene не указан, так что он будет возвращать самый большой ограничивающий прямоугольник из всех элементов на сцене с момента создания сцены (т. Е. Прямоугольник, который увеличивается при добавлении или перемещении элементов в сцене, более деталь здесь ) Мой виджет в итоге выглядел так:

Actual outcome

Проблема: sizeHint таблицы не не используется для генерации ширины TableView. Как я могу изменить коды, чтобы придать таблицам ожидаемую ширину и позволить QGraphicsView заполнить оставшееся пространство?

Вот примеры кодов:

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class DeviceTableView : public QTableView
{
protected:
    QSize sizeHint() const override
    {
        // here is the preferred width of the table.
        return QSize(150, QWidget::size().rheight());
    }
};

class MainWidget : public QWidget {
    Q_OBJECT
public:
    MainWidget();
private:
    QGraphicsView* patchingView;
    QGraphicsScene *patchingScene;

    DeviceTableView *table1;
    DeviceTableView *table2;
    QSplitter *tablesSplitter;
    QSplitter *horizontalSplitter;
    QHBoxLayout *overallLayout;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    MainWidget* mainWidget;
};
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    mainWidget = new MainWidget;
    setCentralWidget(mainWidget);
}

MainWindow::~MainWindow()
{
    delete ui;
}

MainWidget::MainWidget()
{
    table1 = new DeviceTableView();
    table1->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

    table2 = new DeviceTableView();
    table2->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

    // add a splitter between two tables
    tablesSplitter = new QSplitter;
    tablesSplitter->addWidget(table1);
    tablesSplitter->addWidget(table2);
    tablesSplitter->setOrientation(Qt::Vertical);

    patchingScene = new QGraphicsScene;
    patchingView = new QGraphicsView(patchingScene);

    // add a splitter between the tables and the QGraphicsView
    horizontalSplitter = new QSplitter(this);
    horizontalSplitter->setOrientation(Qt::Horizontal);

    horizontalSplitter->addWidget(tablesSplitter);
    horizontalSplitter->addWidget(patchingView);

    // layout the tables and the QGraphicsView horizontally
    overallLayout = new QHBoxLayout(this);
    overallLayout->addWidget(horizontalSplitter);

    patchingView->show();
}
...