我试图在Qt5的主窗口类中使用停靠小部件。但是,当我将中央窗口小部件设置为固定高度时,Qt无法将窗口对接到顶部或底部。基本上,看起来有一些" padding"或"保证金"在中央小部件的上方和下方。如果我在窗口小部件上设置了自动高度,则对接可以在边对边(顶部/底部)的整个过程中正常工作。如何在使用固定高度的中央窗口小部件时删除边距或启用对接功能?
例如,请参见屏幕截图。
码头右侧有自动高度(中央小工具没有边距)
底座底部带自动高度(中央部件无边距)
码头底部带有固定高度(边距/填充 - 灰色区域,赢得了停靠)
如果有帮助,这是代码。
标题
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow(QString);
~MainWindow();
private:
void createDockWindows();
QListWidget *m_dock_list;
QString m_directory;
QWidget *m_mainWidget;
};
课程定义:
MainWindow::MainWindow(QString program)
: m_directory(".")
{
m_mainWidget = new QWidget;
m_mainWidget->setFixedHeight(156);
m_mainWidget->setStyleSheet("background-color: blue;");
createDockWindows();
// set central widget and default size
setCentralWidget(m_mainWidget);
}
// dock functions
void MainWindow::createDockWindows()
{
QDockWidget *dock = new QDockWidget(tr("Dock List"), this);
dock->setAllowedAreas(Qt::LeftDockWidgetArea |
Qt::RightDockWidgetArea |
Qt::BottomDockWidgetArea);
m_dock_list = new QListWidget(dock);
m_dock_list->addItems(QStringList()
<< "item 1"
<< "item 2"
<< "item 3"
<< "item 4");
dock->setWidget(m_dock_list);
addDockWidget(Qt::RightDockWidgetArea, dock);
}
答案 0 :(得分:0)
如果有其他人试图找出这种行为,这就是我发现的。顶部和底部边距只是Qt试图将固定大小的小部件放入比小部件更大的空间(明显的)。但是,受限制的对接能力来自具有最小垂直尺寸的对接小部件。因此,当window height < central widget height + min(docking widget height)
Qt不允许停靠功能时。一旦达到阈值窗口高度(通过用户调整大小),Qt就允许停靠功能。
我更喜欢无论窗口高度如何都发生对接功能,并且自动窗口调整大小以容纳对接窗口。
使用signals
可能有点 hacky ,如果您的布局复杂,可能很难维护。但对于我的用例,这是可行的。
代码:
void MainWindow::createDockWindows()
{
...
QObject::connect(dock, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)),
this, SLOT(s_dock_window_resize(Qt::DockWidgetArea)));
}
// Autosize window slot on dock location change.
void MainWindow::s_dock_window_resize(Qt::DockWidgetArea area)
{
if (area == Qt::DockWidgetArea::BottomDockWidgetArea) {
// m_mainWidget_min_height is the height we would have enforced
// on the widget. Now we set it somewhere else and check it here.
int min_height = m_dock_list->height() + m_mainWidget_min_height;
if (min_height > MainWindow::height()) {
MainWindow::resize(MainWindow::width(), min_height);
}
}
}