在Qt中手动设置窗口布局的正确方法

在Qt中手动设置窗口布局的正确方法,qt,qwidget,qmainwindow,qlayout,qgridlayout,Qt,Qwidget,Qmainwindow,Qlayout,Qgridlayout,我需要一个QMainWindow布局来根据内核的数量进行更改。 因此,我不使用设计模式手动设置它 我的问题是: 创建此布局后,如何引用它包含的小部件 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //... buildLayout(); //... // Now I

我需要一个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);
}
我可以从这个->centralWidget中获取QLayoutItem。 或者我可以在MainWindow类的布局成员中创建所有小部件并直接访问它们

不过,我觉得这两种方法都不对

有没有办法将小部件传递到ui? 这样我就可以打电话联系他们了
ui->threadingTable

两个选项都可以。可以从主类成员或直接从对象层次结构获取指向threadingTable的指针:

qDebug() << qobject_cast<QGridLayout *>(this->centralWidget()->layout())->itemAtPosition(0, 0)->widget();
qDebug() << this->centralWidget()->layout()->itemAt(0)->widget();
当然,可能需要空验证。你也可以检查这个问题

类Ui::MainWindow是从可在设计模式下生成的.Ui xml表单自动生成的:

由于布局是手动构建的,.ui文件和ui实例根本不需要。您可以从项目中删除它们

另一方面,即使在.ui表单的设计模式下,也可以使用自定义小部件。
因此,如果您需要一些棘手的对象,您可以在handy设计模式下构建整个表单,然后,例如,标准的QTableView可能会升级到继承自QTableView的CustomTableView。这个自定义类可能实现一些特殊的行为。

在我看来,让小部件也成为主类的成员没有错。当然,您通常不需要访问所有信号,在将它们添加到布局之前,可能会连接信号。