web-dev-qa-db-ja.com

コードからUIで作成されたQtレイアウトにアクセスしますか?

これはおそらく私が今までに経験した中で最もばかげた問題ですが、私は非常に混乱しています。レイアウトを始めようとしていますが、どういうわけかこれがわかりません。

QGridLayoutをプロジェクトにドラッグドロップするだけで、.uiファイルを介して追加しようとしました。ロード時にグリッドにウィジェットを追加したいので、this-> setupui()が呼び出される前と後の両方で、「mainwindow.h」ファイルの「gridLayout」オブジェクトを使用しようとしました。

それがわからなかったので、コードを使って最初から作成してみることにし、代わりにmain.cppファイルに以下を追加しました。これも表示されなかったので、フォームが読み込まれたときに、一体どうやってグリッドにデータを入力できるのでしょうか。

#include <QtGui/QApplication>
#include <QtGui>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    MainWindow w;

    QGridLayout *grid = new QGridLayout;

    QLabel *label1 = new QLabel("test");
    QLabel *label2 = new QLabel("test 2");

    grid->addWidget(label1, 0, 0);
    grid->addWidget(label2, 0, 1);
    w.setLayout(grid);

    w.show();
    return app.exec();
}
20
user470760

QtDesignerのQGridLayoutをMainWindowのcentralWidgetに次のように設定したと仮定します。

enter image description here

mainWindowコードで、正しいオブジェクト名(ここではgridLayout)を使用してこの方法でアクセスできます。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->gridLayout->addWidget(new QLabel("hello world"),0,0);
}

QtDesignerまたはコードでレイアウトを設定し、レイアウトを変更したい場合、QWidgetでは別のレイアウトをインストールできず、次のようなエラーメッセージが表示されます。

QWidget :: setLayout:すでにレイアウトが設定されているMainWindow "MainWindow"にQLayout ""を設定しようとしています

この場合、最初に既存のレイアウトを削除してから、上記のコードのように新しいレイアウトをインストールする必要があります。

メイン関数のレイアウトにアクセスする場合は、次のようなQObject :: findChild関数を使用してこれを実現できます。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    QGridLayout *gridLayout = w.findChild<QGridLayout*>("gridLayout");
    Q_ASSERT(gridLayout);
    gridLayout->addWidget(new QLabel("hello, the second"));

    w.show();
    return a.exec();
}
26
tomvodi