2015-09-20 7 views
0

Мне нужен макет QMainWindow для изменения в зависимости от количества ядер. Поэтому я устанавливаю его вручную (не используя режим разработки).Правильный способ вручную установить макет окна в Qt

Мой вопрос: После того как этот макет был создан, как я могу обратиться к виджетам, которые он содержит?

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? Чтобы я мог получить к ним доступ, позвонив по телефону ui->threadingTable

+0

По-моему, нет ничего плохого в том, что виджеты также входят в «основной» класс. Конечно, вам обычно не нужно обращаться ко всем из них, и сигналы могут быть подключены, прежде чем добавлять их в макет. – juzzlin

ответ

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, которые могут быть созданы в режиме конструктора: "Using a Designer UI File in Your Application"

Поскольку макет построен вручную файл .ui и экземпляр ui не нужен. Вы можете удалить их из своего проекта.

С другой стороны, пользовательские виджеты можно использовать даже в режиме разработки в формах .ui. Итак, если вам нужен какой-то сложный объект, вы можете построить всю форму в удобном режиме разработки, а затем, например, стандарт QTableView может быть повышен до вашего CustomTableView, который унаследован от QTableView. Этот пользовательский класс может реализовать какое-то особое поведение.