当QMainWindow调整大小时,QDockWidget拆分器跳转

时间:2018-01-05 19:20:57

标签: c++ qt window-resize qmainwindow qdockwidget

在我的旧程序中,我在QDockWidget中有2列QTableWidget。

在现代建立它(Qt 5.10)我似乎必须override the table's sizeHint()才能使它成为100px以外的宽度。哪个有点烦人(以前不需要这个 - 为什么表格的宽度不是默认的头文件?)

但是经过调整后,现在又出现了另一个麻烦:如果用户为停靠窗口小部件移动分割器,它将在任何窗口调整大小时丢失。我做了一点MCVE来展示效果......这是启动情况:

situation on startup

然后让我们说用户稍微拖动分离器(可能是扩展,可能是收缩 - 无关紧要):

user moves splitter

现在他们将窗口的下边缘向下拖动一点,然后 snap ,它会跳回到首选大小(当鼠标第一次开始拖动时会突然跳转):

after window resize

将水平尺寸政策从QSizePolicy::Preferred更改为QSizePolicy::Ignored似乎不会影响此行为,不会调用setStretchLastSection()似乎也没有帮助。

我更喜欢如果窗口垂直调整大小,水平分割器根本不移动......如果水平调整大小,那么比跳跃更加渐进。有任何想法吗? Qt Creator似乎没有关注其关注列表中的这个问题,但是我对源代码的了解不够深入了解原因。

mainwindow.h:

#include <QMainWindow>

QT_BEGIN_NAMESPACE
class QTextEdit;
class SizedTableWidget;
QT_END_NAMESPACE

class SizedTableWidget;

class MainWindow : public QMainWindow {
    Q_OBJECT

    QTextEdit *textEdit;
    SizedTableWidget *table;

public:
    MainWindow ();
};

mainwindow.cpp:

#include <QtWidgets>

#include "mainwindow.h"

class SizedTableWidget : public QTableWidget {
public:
    SizedTableWidget (int rows, int columns, QWidget *parent) :
        QTableWidget (rows, columns, parent) {}

    QSize sizeHint() const {
        return QSize (
            verticalHeader()->width()
                + horizontalHeader()->length()
                + frameWidth() * 2,
            horizontalHeader()->height()
                + verticalHeader()->length()
                + frameWidth() * 2
        );
    }
};

MainWindow::MainWindow() : textEdit(new QTextEdit) {
    setCentralWidget(textEdit);

    QDockWidget *dock = new QDockWidget(tr("Table"), this);
    dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);

    table = new SizedTableWidget (1 /* rows */, 2 /* cols */, dock);
    table->setHorizontalHeaderLabels(QStringList() << "name" << "value");

    QTableWidgetItem *nameItem = new QTableWidgetItem;
    nameItem->setText("foo");
    table->setItem(0, 0, nameItem);

    QTableWidgetItem *valueItem = new QTableWidgetItem;
    valueItem->setText("10");
    table->setItem(0, 1, valueItem);

    table->horizontalHeader()->setStretchLastSection(true);
    table->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);

    dock->setWidget(table);
    addDockWidget(Qt::RightDockWidgetArea, dock);
}

P.S。如果有人知道为什么Windows上的列和行标题没有任何样式,我有兴趣知道......这是故意的吗?在Linux上看起来很好。

系统信息:

  • Qt 5.10.0
  • Qt Creator 4.5.0
  • Windows 10 Home,1709 (Build 16299.125)和MSVC 2017
  • Kubuntu Linux 17.10和gcc 7.2.0

1 个答案:

答案 0 :(得分:3)

这似乎是一个错误 - 现在由多方确认 - 出现在Qt 5.10中:

https://bugreports.qt.io/browse/QTBUG-65592

注释中提供了一个建议的解决方法,直到它被修复:

  

调用resizeDocks({nameOfAnyDock}, {40}, Qt::Horizontal)启用调整大小(确切的数字无关紧要)。调用addDockWidget后立即调用该函数。