質問: Qtでウインドウ上にフレームとスタックレイアウトを組み合わせてデザインしています ある動作をすると複数あるうちのフレームをhideとすると、隣のフレームがパカッとその分広がる・・・と言うところまでは出来たのですが その広がったフレーム上のスタックレイアウトが一緒に広がってくれません resizeEventはフォームにはあるようなのですが フレームでなんとかイベントを発生させることは出来ないでしょうか **補足** ![frameとstackの画像](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) ソースは以下のようにframeのresizeEventをmainwindowクラスのtestという関数に接続している・・・・つもりです mainwindow.h ``` private slots: void on_pushButton_clicked(); void test(QResizeEvent *event); ``` mainwindow.cpp ``` 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() << "フレームリサイズ"; } ```
回答: 質問の構成で試してみましたが、`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`のサイズも適切に変化すると思います。 なお、リサイズイベントの確認の仕方として、 ``` connect(ui->frame_2,SIGNAL(QFrame::resizeEvent(QResizeEvent *event)),this,SLOT(MainWindow::test(QResizeEvent *event))); ``` としていますが、`resizeEvent()`メソッドはsignalではないので、この方法では確認できません。(`QWidget`クラスで定義されているメンバ関数です) 詳細は割愛しますが、`frame_2`の`installEventFilter()`メソッドを使うとよいと思います。