Правильный способ вручную установить макет окна в 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);
}

Я могу получить QLayoutItem из this->centralWidget(). Или я могу сделать все виджеты в макете членами класса MainWindow и получить к ним прямой доступ.

Однако я чувствую, что ни один из этих способов не является правильным.

Есть ли способ передать виджеты пользовательскому интерфейсу? Чтобы я мог получить к ним доступ, позвонив ui->threadingTable


person Oleksandr Zaytsev    schedule 20.09.2015    source источник
comment
На мой взгляд, нет ничего плохого в том, чтобы сделать виджеты также членами основного класса. Конечно, обычно вам не нужно обращаться ко всем из них, и сигналы могут быть подключены до их добавления в макет.   -  person juzzlin    schedule 20.09.2015


Ответы (1)


Оба варианта хороши. Можно получить указатель на 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 формах. Итак, если вам нужен какой-то хитрый объект, вы можете построить всю форму в удобном режиме «Дизайн», а затем, например, стандартную QTableView можно повысить до вашей CustomTableView, унаследованной от QTableView. Этот пользовательский класс может реализовывать какое-то особое поведение.

person Orest Hera    schedule 20.09.2015