关于c ++:带有QMainWindow和QWidget的QBoxLayout

QBoxLayout with QMainWindow vs QWidget

当我将QHBoxLayout与QMainWindow和QWidget一起使用时,我想询问发生的事情。我试图通过连接2个小部件来更改窗口标题样式。
这是怎么回事:
在QWidget下
enter image description here

这是代码:
标题栏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#ifndef MYTITLEBAR_H
#define MYTITLEBAR_H

#include <QMainWindow>
#include <QMouseEvent>
#include <QToolButton>
#include <QStyle>
#include <QLabel>
#include <QHBoxLayout>
#include <QPixmap>

class MyTitleBar : public QWidget
{
public:
    MyTitleBar( QWidget* parent );
public slots:
    void showSmall();
    void showMaxRestore();

protected:
    void mousePressEvent( QMouseEvent* me );
    void mouseMoveEvent( QMouseEvent* me );

private:
    QToolButton* minimize;
    QToolButton* maximize;
    QToolButton* close;
    QToolButton* custom;
    QPixmap restorePix, maxPix, closePix, minPix, customPix;
    bool maxNormal;
    QPoint startPos;
    QPoint clickPos;
};

#endif // MYTITLEBAR_H

TitleBar.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include"mytitlebar.h"

MyTitleBar::MyTitleBar( QWidget* parent )
{
    this->setWindowFlags( Qt::FramelessWindowHint );

    minimize = new QToolButton(this);
    maximize = new QToolButton(this);
    close = new QToolButton(this);
    custom = new QToolButton(this);

    closePix.load("close.png" );
    close->setIcon( closePix );

    maxPix.load("maximize.png" );
    maximize->setIcon( maxPix );

    minPix.load("minimize.png" );
    minimize->setIcon( minPix );

    customPix.load("custom_icon.png" );
    custom->setIcon( customPix );

    QLabel* label = new QLabel(this);
    label->setText("Custom Window" );

    QHBoxLayout* HBox = new QHBoxLayout( this );

    HBox->addWidget( custom );
    HBox->addWidget( label );
    HBox->addWidget( minimize );
    HBox->addWidget( maximize );
    HBox->addWidget( close );



}

void MyTitleBar::showSmall()
{

}

void MyTitleBar::showMaxRestore()
{

}

void MyTitleBar::mousePressEvent(QMouseEvent *me)
{

}

void MyTitleBar::mouseMoveEvent(QMouseEvent *me)
{

}

在QMainWindow下:
enter image description here

代码与QWidget完全相同,但是我将父代和继承更改为QMainWindow,然后返回问题为什么会发生以及如何解决? 在主窗口中,它只是增加了类并将其移到正确的位置,它看起来像窗口标题栏,并且与QWidget和QMainWindow相同。
我需要使用QMainWindow作为父级,因为主窗口是QMainWindow的继承。


问题在于QMainWindow已经具有布局,请参见此处的文档,因此代码无法像QWidget一样工作,您需要使用centralWidget,将布局设置为centralWidget并将所有窗口小部件添加到 布局。