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



我需要一个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()中获得QLayoutItem。或者我可以在MainWindow类的布局成员中设置所有的小部件,并直接访问它们。

然而,我觉得这两种方法都不是正确的。

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

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

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

当然,null可能需要验证。您也可以检查这个问题QGridLayout:获取添加的QWidget列表。

Ui::MainWindow是从.ui xml表单自动生成的,可以在设计模式下生成:"在应用程序中使用设计器UI文件"

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

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

相关内容

  • 没有找到相关文章

最新更新