65594


Qtでウインドウ上にフレームとスタックレイアウトを組み合わせてデザインしています  
ある動作をすると複数あるうちのフレームをhideとすると、隣のフレームがパカッとその分広がる・・・と言うところまでは出来たのですが  
その広がったフレーム上のスタックレイアウトが一緒に広がってくれません

resizeEventはフォームにはあるようなのですが  
フレームでなんとかイベントを発生させることは出来ないでしょうか

**補足**  
[![frameとstackの画像](https://i.stack.imgur.com/zT1tQ.png)](https://i.stack.imgur.com/zT1tQ.png)  
上図のような感じで配置してあります  
ボタンクリックなどでframe02をhide()とするとframe01が自動的にサイズが大きくなるのですが  
frame01に載っているStackLayoutが連動してくれません  
なのでframeのイベントが取りたかったのです  
StackLayoutがframe01に自動で連動するような仕組みがあるのであればそれがイベントで無くても良いのですが・・

**補足2**  
ありがとうございます  
デザイナーで配置しているので、frameの上に載っていないということはないと思うのですが・・  
こんな感じです  
frameかframe_2のリサイズが取れればあとは自分でstackLayoutのサイズを変更しようと思っていました  
また、コンストラクタの中で、  
ui->frame_2->setLayout(ui->StackdWidget);  
としたところレイアウトのクラスではないということでコンパイルは通りませんでした(すいません、Stackはレイアウトクラスではなくウィジェットになるようです)

[![画像の説明をここに入力](https://i.stack.imgur.com/HcfCx.png)](https://i.stack.imgur.com/HcfCx.png)  
ソースは以下のようにframeのresizeEventをmainwindowクラスのtestという関数に接続している・・・・つもりです

mainwindow.h

[code]

    private slots:
        void on_pushButton_clicked();
        void test(QResizeEvent *event);
    
    
[/code]

mainwindow.cpp

[code]

    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        //リサイズイベント
        connect(ui->frame_2,SIGNAL(QFrame::resizeEvent(QResizeEvent *event)),this,SLOT(MainWindow::test(QResizeEvent *event)));
        connect(ui->frame,SIGNAL(QFrame::resizeEvent(QResizeEvent *event)),this,SLOT(MainWindow::test(QResizeEvent *event)));
    
    }
    
    
    //リサイズイベントで来るはず　★実際は来ない
    void MainWindow::test(QResizeEvent *event)
    {
        qDebug() << "フレームリサイズ";
    }
    
    
[/code]


CC BY-SA 4.0
2020-04-12T06:39:50.927
65554
2020-04-14T08:59:54.507
2020-04-14T06:54:02.533
10098
10098
question
qt qt-creator
Qt frameのリサイズイベント


質問の構成で試してみましたが、`frame02`(`QFrame`)を`hide()`すると、`frame01`(`QFrame`)と  
`frame01`に設定されている`stackLayout`(`QStackedLayout`)上のウィジェットは、リサイズされました。(`HLayout`領域一杯に広がった)  
ですので、`QFrame`でも`resizeEvent`は発生します。

リサイズされない原因として2つ考えられます。

  1. `stackLayout`が`frame01`に設定されていない。  
つまり、`frame01->setLayout(stackLayout)`が抜けている。

  2. `stackLayout`上のウィジェットが`stackLayout`に設定されていない。  
つまり、(ウィジェットを`widget`とすると)`stackLayout->addWidget(widget)`が抜けている。  
(※ウィジェットが複数の場合、`widget`上に設定する必要があります)

この2点を確認してはどうでしょうか?

# 補足2に対しての回答

デザイナーのスクリーンショットを見る限り、`frame_2`にレイアウトを設定していないため、`frame_02`のサイズが変化した際に`stackedWidget`に`resizeEvent`が伝搬していないように見受けました。  
ですので、`frame_02`に適当なレイアウト(例:
水平に並べる=`QHBoxLayout`)を設定することで、`stackedWidget`のサイズも適切に変化すると思います。

なお、リサイズイベントの確認の仕方として、

[code]

    connect(ui->frame_2,SIGNAL(QFrame::resizeEvent(QResizeEvent *event)),this,SLOT(MainWindow::test(QResizeEvent *event)));
    
[/code]

としていますが、`resizeEvent()`メソッドはsignalではないので、この方法では確認できません。(`QWidget`クラスで定義されているメンバ関数です)

詳細は割愛しますが、`frame_2`の`installEventFilter()`メソッドを使うとよいと思います。


CC BY-SA 4.0
2020-04-13T14:31:48.147
65594
2020-04-14T08:59:54.507
2020-04-14T08:59:54.507
20098
20098
65554
answer