在我的旧程序中,我在QDockWidget中有2列QTableWidget。
在现代建立它(Qt 5.10)我似乎必须override the table's sizeHint()才能使它成为100px以外的宽度。哪个有点烦人(以前不需要这个 - 为什么表格的宽度不是默认的头文件?)
但是经过调整后,现在又出现了另一个麻烦:如果用户为停靠窗口小部件移动分割器,它将在任何窗口调整大小时丢失。我做了一点MCVE来展示效果......这是启动情况:
然后让我们说用户稍微拖动分离器(可能是扩展,可能是收缩 - 无关紧要):
现在他们将窗口的下边缘向下拖动一点,然后 snap ,它会跳回到首选大小(当鼠标第一次开始拖动时会突然跳转):
将水平尺寸政策从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上看起来很好。
系统信息:
答案 0 :(得分:3)
这似乎是一个错误 - 现在由多方确认 - 出现在Qt 5.10中:
https://bugreports.qt.io/browse/QTBUG-65592
注释中提供了一个建议的解决方法,直到它被修复:
调用
resizeDocks({nameOfAnyDock}, {40}, Qt::Horizontal)
启用调整大小(确切的数字无关紧要)。调用addDockWidget
后立即调用该函数。