调整QMainwindow的大小以适应Qdockwidget的大小

Resize QMainwindow to fit Qdockwidget size

本文关键字:Qdockwidget 调整 QMainwindow      更新时间:2023-10-16

我有一个QMainWindow和一个嵌套在其中的QDockWidget

我显示了一些图形,所以QDockWidget展开,但QMainWindow保持其初始大小,所以我必须使用鼠标调整其大小。

那么,如何每次都将QMainWindow大小调整为QDockWidget大小呢?

最后很容易。

我取QDockWidgetsQsize,并将QMainWIndow调整为这个大小。

例如,我有两个并排的QDockWidget,所以我所做的是

QSize siz =  Dock->size();
QSize siz2 =  Dock2->size();
resize(siz.width()+siz2.width(),siz.height);

您可能需要重写QDockWidget小部件的resizeEvent函数。为此,您需要对QDockWidget进行子类化。

class MYDockwidget : public QDockWidget
{
    Q_OBJECT
public:
    MYDockwidget(QWidget *parent = 0):
    QDockWidget(parent)
    {}
protected:
    void resizeEvent(QResizeEvent *event)
    {
        QDockWidget::resizeEvent(event);
        // Calulate Main window size here.
        // the main window is accesible
        // through the parent property.
    }
};

这种方法有效,但将QDockWidget的resizeEvent绑定到QMainWindow。正确的解决方案是当QDockWidget的大小改变时发出信号。

为此,您需要定义一个自定义信号,当然您希望该信号包含有关所讨论事件的信息,因此我们的信号将使用QSize参数发射。

class MYDockwidget : public QDockWidget
{
    Q_OBJECT
public:
    MYDockwidget(QWidget *parent = 0):
    QDockWidget(parent)
    {}
signals:
    void sizeChanged(QSize);
protected:
    void resizeEvent(QResizeEvent *event)
    {
        QDockWidget::resizeEvent(event);
        emit sizeChanged(event->size());
    }
};

之后,您可以编写如下代码:

// Inside your main window.
public slots:
    void on_dock_size_changed(QSize)    
MYDockwidget *dock = new MYDockwidget(this);
connect(dock, SIGNAL(sizeChanged(QSize)), this, SLOT(on_dock_size_changed(QSize)));
void on_dock_size_changed(QSize size)
{
    // resize your main window here.
}

缺点:

您将需要手动(以编程方式)设置QDockWidget的属性,除非您自己将自定义小部件作为QTDesigner插件插入。