36662


Qt5について、下のようにすると、ボタンなどが全く表示されず、空のボックスが表示されます。コンパイルが通っているのでエラー？なのかどうかよくわかりませんが、コンソールに

QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which
already has a layout

と表示されます。setLayoutの使い方が間違っている気がするのですが、わかる方助けてください。

[code]

    //Header
    #include <QMainWindow>
    #include<QVBoxLayout>
    #include<QLabel>
    #include<QPushButton>
    #include<QHBoxLayout>
    
    class MainWindow : public QMainWindow
    {
    Q_OBJECT
    
    public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
    private:
    };
    //mainファイル
    #include "mainwindow.h"
    #include <QApplication>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
    return a.exec();
    }
    
    
     //cpp_file
    #include "mainwindow.h"
    
    
    MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    {
        QVBoxLayout *vLayout = new QVBoxLayout();
        vLayout->addWidget(new QLabel("hello"));
        vLayout->addWidget(new QPushButton("hello2"));
        QHBoxLayout *hLayout = new QHBoxLayout();
        hLayout->addLayout(vLayout);
        hLayout->addWidget(new QPushButton("hello3"));
    
        setLayout(hLayout);
    }
    
    MainWindow::~MainWindow()
    {
    
    }
    
[/code]


CC BY-SA 3.0
2017-07-25T11:37:48.203
36659
2017-07-25T14:04:21.210
24573
question
qt5
Qt5のレイアウト設定について


まず、全体を格納するためのウィジェット（CentralWidget）を作成してください。

ラベルやボタン等を作成する際は、親ウィジェットとして、自分自身のMainWindow（`this`）を指定してください。

すべてのパーツを作成し終わったら、`setCentralWidget`を行ってください。

[code]

    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
    {
        QWidget *central = new QWidget(this);
    
        QVBoxLayout *vLayout = new QVBoxLayout();
        vLayout->addWidget(new QLabel("hello", this));
        vLayout->addWidget(new QPushButton("hello2", this));
        QHBoxLayout *hLayout = new QHBoxLayout(central);
        hLayout->addLayout(vLayout);
        hLayout->addWidget(new QPushButton("hello3", this));
    
        setCentralWidget(central);
    }
    
[/code]


CC BY-SA 3.0
2017-07-25T12:01:45.343
36662
2017-07-25T12:01:45.343
3337
36659
answer


soramimiさんの回答とは別の回答です。

質問のコードで、`MainWindow`を`QMainWindow`の派生クラスとしていますが、`QWidget`の派生クラスにすると期待通り動作すると思います。

[code]

        // コード例 (mainwindow.h)
        #include <QWidget>
    
        class MainWindow : public QWidget {
            /* 省略 */
        };
    
[/code]

補足です。`QMainWindow`はメニューバー、ステータスバー、CentralWidget等、一般的なウインドウが持つパーツを配置しやすいような仕様になっており、最初からLayoutを持っているので件のメッセージが表示されるようです。  
具体的な仕様は、[`QMainWindow`のヘルプ](http://doc.qt.io/qt-5/qmainwindow.html)を参照してみてください。  
ちなみに、その説明には、次のように「CentralWidgetは設定する必要がある」とあります。

> Creating a main window without a central widget is not supported. You must
> have a central widget even if it is just a placeholder.


CC BY-SA 3.0
2017-07-25T14:04:21.210
36666
2017-07-25T14:04:21.210
20098
36659
answer