22

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

プロジェクトにドラッグドロップするだけで、.uiファイルを介してQGridLayoutを追加しようとしました。読み込み時にグリッドにウィジェットを設定したいので、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();
}
4

1 に答える 1

28

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

ここに画像の説明を入力

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

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();
}
于 2012-09-30T09:02:08.427 に答える