我需要一个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
可能会被提升为继承自QTableView
的CustomTableView
。这个自定义类可以实现一些特殊的行为。