QMainWindow Resized 时 QDockWidget 拆分器跳转
QDockWidget splitter jumps when QMainWindow Resized
在我的一个旧程序中,我在 QDockWidget 中有 2 列 QTableWidget。
在现代构建它 (Qt 5.10) 我似乎必须 override the table's sizeHint() 才能让它成为 100px 或其他宽度以外的宽度。这有点烦人 (以前不需要这个——为什么 table 的宽度不是默认值 headers?)
但是经过调整后,现在又出现了另一个麻烦:如果用户对停靠小部件的拆分器进行了任何移动,它将在任何 window 调整大小时丢失。我做了一点MCVE来展示一下效果...这是启动情况:
然后假设用户稍微拖动拆分器(可能是扩展,可能是收缩——无关紧要):
现在他们将 window 的底部边缘向下拖动一点,然后 snap,它会跳回到首选大小(突然跳跃发生在鼠标先开始拖动):
将水平大小策略从 QSizePolicy::Preferred
更改为 QSizePolicy::Ignored
似乎不会影响此行为,不调用 setStretchLastSection()
似乎也无济于事。
我希望 window 垂直调整大小,使水平拆分器完全不动...如果水平调整大小,则可以进行比跳跃更渐进的操作。有任何想法吗? 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 上的列和行 headers 没有任何样式,我很想知道...这是故意的吗?在 Linux.
上看起来不错
系统信息:
- Qt 5.10.0
- Qt Creator 4.5.0
- Windows 10 主页,1709 (内部版本 16299.125) 和 MSVC 2017
- Kubuntu Linux 17.10 和 gcc 7.2.0
这似乎是 Qt 5.10 中出现的错误——现在已得到多方确认:
https://bugreports.qt.io/browse/QTBUG-65592
评论中给出了建议的解决方法,直到它被修复:
Calling resizeDocks({nameOfAnyDock}, {40}, Qt::Horizontal)
enabled the resize to work (the exact number is irrelevant). The function is called immediately after calling addDockWidget
.
在我的一个旧程序中,我在 QDockWidget 中有 2 列 QTableWidget。
在现代构建它 (Qt 5.10) 我似乎必须 override the table's sizeHint() 才能让它成为 100px 或其他宽度以外的宽度。这有点烦人 (以前不需要这个——为什么 table 的宽度不是默认值 headers?)
但是经过调整后,现在又出现了另一个麻烦:如果用户对停靠小部件的拆分器进行了任何移动,它将在任何 window 调整大小时丢失。我做了一点MCVE来展示一下效果...这是启动情况:
然后假设用户稍微拖动拆分器(可能是扩展,可能是收缩——无关紧要):
现在他们将 window 的底部边缘向下拖动一点,然后 snap,它会跳回到首选大小(突然跳跃发生在鼠标先开始拖动):
将水平大小策略从 QSizePolicy::Preferred
更改为 QSizePolicy::Ignored
似乎不会影响此行为,不调用 setStretchLastSection()
似乎也无济于事。
我希望 window 垂直调整大小,使水平拆分器完全不动...如果水平调整大小,则可以进行比跳跃更渐进的操作。有任何想法吗? 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 上的列和行 headers 没有任何样式,我很想知道...这是故意的吗?在 Linux.
上看起来不错系统信息:
- Qt 5.10.0
- Qt Creator 4.5.0
- Windows 10 主页,1709 (内部版本 16299.125) 和 MSVC 2017
- Kubuntu Linux 17.10 和 gcc 7.2.0
这似乎是 Qt 5.10 中出现的错误——现在已得到多方确认:
https://bugreports.qt.io/browse/QTBUG-65592
评论中给出了建议的解决方法,直到它被修复:
Calling
resizeDocks({nameOfAnyDock}, {40}, Qt::Horizontal)
enabled the resize to work (the exact number is irrelevant). The function is called immediately after callingaddDockWidget
.