0

コアの数に応じて変更する QMainWindow レイアウトが必要です。したがって、手動で設定します(デザインモードを使用しません)。

私の質問は、このレイアウトが作成された後、そこに含まれるウィジェットを参照するにはどうすればよいですか?

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //...
    buildLayout();
    //...

    // Now I'd like to use something like this:
    // ui->threadingTable->...
    // However, it's not the member of ui
}

void MainWindow::buildLayout()
{
    QWidget *window = new QWidget(this);

    QTableView *threadingTable = new QTableView(window);
    //...

    QGridLayout *layout = new QGridLayout(window);
    layout->addWidget(threadingTable, 0, 0);
    //...

    window->setLayout(layout);
    this->setCentralWidget(window);
}

から QLayoutItem を取得できますthis->centralWidget()。または、すべてのウィジェットを MainWindow クラスのレイアウト メンバーに作成し、それらに直接アクセスすることもできます。

しかし、私はどちらも正しい方法ではないと感じています。

ウィジェットを ui に渡す方法はありますか? 呼び出してアクセスできるように ui->threadingTable

4

1 に答える 1

0

どちらのオプションも問題ありません。threadingTableメイン クラス メンバから、またはオブジェクト階層から直接ポインタを取得することができます。

qDebug() << qobject_cast<QGridLayout *>(this->centralWidget()->layout())->itemAtPosition(0, 0)->widget();
qDebug() << this->centralWidget()->layout()->itemAt(0)->widget();

もちろん、null確認が必要な場合もあります。この質問QGridLayout: Getting the list of QWidget addedも確認できます。

クラスは、デザイン モードで生成できる xml フォームUi::MainWindowから自動的に生成されます: 「アプリケーションでデザイナー UI ファイルを使用する」.ui

レイアウトは手動で作成されるため、.uiファイルとuiインスタンスはまったく必要ありません。プロジェクトからそれらを削除できます。

一方、.uiフォームのデザイン モードでもカスタム ウィジェットを使用することができます。そのため、トリッキーなオブジェクトが必要な場合は、フォーム全体を便利なデザイン モードで構築できます。たとえば、標準を から継承されたQTableViewものに昇格させることができます。そのカスタム クラスは、いくつかの特別な動作を実装する場合があります。CustomTableViewQTableView

于 2015-09-20T16:51:10.287 に答える