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);
}

我可以从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

该类Ui::MainWindow是从.ui可以在设计模式下生成的 xml 表单中自动生成的:“在您的应用程序中使用 Designer UI 文件”

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

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

于 2015-09-20T16:51:10.287 回答