gpt4 book ai didi

c++ - QMainWindow Resized 时 QDockWidget 拆分器跳转

转载 作者:行者123 更新时间:2023-11-30 02:21:37 25 4
gpt4 key购买 nike

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

在现代构建它(Qt 5.10)我似乎必须 override the table's sizeHint()让它成为 100px 或其他宽度以外的宽度。这有点烦人(以前不需要这个——为什么表格的宽度不是通过标题的默认值?)

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

situation on startup

然后假设用户稍微拖动拆分器(可能是扩展,可能是收缩——无关紧要):

user moves splitter

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

after window resize

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

我更喜欢垂直调整窗口大小,而不是水平分割器根本不移动...如果水平调整窗口大小,则比跳跃更渐进。有任何想法吗? Qt Creator 的监视列表似乎没有这个问题,但我对来源不够熟悉,无法深入研究原因。

主窗口.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 ();
};

主窗口.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);
}

附言如果有人知道为什么 Windows 上的列标题和行标题没有任何样式,我很想知道...这是故意的吗?在 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.

关于c++ - QMainWindow Resized 时 QDockWidget 拆分器跳转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48119969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com