Нет "хорошего" способа сделать это в QtDesigner / QtCreator. В лучшем случае вы можете скопировать / вставить набор элементов управления 50 раз, а затем в коде C ++ скрыть те, которые вам не нужны. Но я бы не рекомендовал это.
Вместо этого просто создайте элементы управления (метки / кнопки / текстовое поле) и макет для их хранения в коде C ++ внутри al oop, который повторяется сколько угодно раз вам нужно во время выполнения. Вставьте макет элементов управления в макет страницы виджета со вкладкой, который вы настроили в режиме конструктора. Это не сложно, и на самом деле будет более эффективным, чем то, что производит QtDesigner, так как это, как правило, генерирует больше кода, чем обычно требуется.
В качестве отправной точки вы можете взглянуть на код C ++, который генерируется инструментом Qt UI Compiler (UI C) для вашего текущего проекта (он берет XML от дизайнера и превращает его в код C ++). Вы можете найти это в папке сборки для вашего проекта, обычно с именем что-то вроде ui_ClassName.h
, возможно, в подпапке ui
дерева сборки.
ОБНОВЛЕНИЕ:
Другой, возможно, лучший способ сделать это - создать «шаблон» QWidget
класс / форму, который будет использоваться несколько раз, как отдельный объект. «Шаблонный» дизайн может быть создан / поддержан с использованием QtCreator / Designer (или просто напрямую в C ++). Здесь (возможным) преимуществом является то, что по мере развития требований к приложению виджет шаблона может быть расширен дополнительными функциями или даже повторно использован в других частях пользовательского интерфейса.
Например, я бы предположил, что текстовому редактору и кнопке в данном изображении макета действительно нужно что-то делать (например, редактировать данные и отправлять их). Таким образом, некоторые базовые функции c могут быть встроены в виджет "шаблон", например, для генерации сигнала с текстовым содержимым редактора строк при нажатии кнопки.
Я собрал быстрый пример. Я создаю простой MainWindow
в чистом C ++, чтобы упростить / сократить код примера. «Шаблон» я называю Editor
. Класс Editor
и форма пользовательского интерфейса, которые я изначально создал с помощью мастера QtCreator (New -> Qt Designer Form Class). Затем я добавил метки / элементы управления в режиме конструктора. А в C ++ сигнал textEdited(const QString &text)
в заголовке, а в конструкторе Editor()
лямбда-соединение для передачи этого сигнала при нажатии кнопки.
Код класса Editor
находится прямо из Мастер QtCreator, за исключением двух правок, которые я выделю ниже. Форма конструктора имеет два соответствующих элемента управления: QLineEdit
(lineEdit
) и QPushButton
(pushButton
). Я приведу ссылки на полные файлы ниже.
Editor.h
// in the Editor class declarations:
signals:
void textEdited(const QString &text) const;
Editor. cpp
// in the constructor, after ui->setupUi(this);
connect(ui->pushButton, &QPushButton::clicked, this, [this]() {
emit textEdited(ui->lineEdit->text());
});
Испытательный комплект, включая MainWindow
подкласс и main()
#include <QApplication>
#include <QMainWindow>
#include <QTabWidget>
#include <QBoxLayout>
#include <QMessageBox>
#include "Editor.h"
class MainWindow : public QMainWindow {
Q_OBJECT
public:
MainWindow() : QMainWindow()
{
// set up a tab widget as the window central widget
QTabWidget *tabWidget = new QTabWidget(this);
setCentralWidget(tabWidget);
// the first/only page will contain all the editors in a vertical layout
QWidget *editorsPage = new QWidget(this);
editorsPage->setLayout(new QVBoxLayout());
// add the editors container page to tab widget
tabWidget->addTab(editorsPage, tr("Editors page"));
// Now create a number of editor widgets using our Editor class "template"
int layoutItems = 5; // number of editors needed, could be dynamic
for (int i=0; i < layoutItems; ++i) {
// Create an Editor instance with the tab page as parent
Editor *editor = new Editor(editorsPage);
// Add the editor widget to the tab page layout
editorsPage->layout()->addWidget(editor);
// A simple connection with the editor signal, as way of example.
connect(editor, &Editor::textEdited, this, [this](const QString &text) {
// just show a message box with the editor text
QMessageBox::information(this, tr("Text Edited"), text, QMessageBox::Ok);
});
}
}
};
int main(int argc, char **argv)
{
QApplication app(argc, argv);
MainWindow mainWindow;
mainWindow.show();
return app.exec();
}
#include "main.moc"

Ссылки Полный код Editor
: Editor.h Редактор. cpp Editor.ui