Qt генерирует пользовательский интерфейс на основе шаблона - PullRequest
0 голосов
/ 06 февраля 2020

Я хочу сгенерировать набор меток и кнопок на основе какого-то шаблона, но я не знаю, как сделать часть шаблона.

Я буду использовать виджет со вкладками, который Я уже настроил, и на одной вкладке я хочу иметь две метки, пользовательскую кнопку и текстовое поле. Это будет повторяться около 40-50 раз (в зависимости от заданного значения при запуске) и будет иметь необходимый интервал.

После того, как у меня есть шаблон, я предполагаю вызвать его в al oop и установить соответствующий отображаемый текст (Label_1, Label_2, et c) и соединить операторы, где это необходимо.

Как я уже сказал, я не знаю, как шаблонировать части пользовательского интерфейса, чтобы они могли быть помещены в своего рода автогенерацию.

Я думал о создании одной группы, копировании xml, и как-то добавить его, но это не совсем правильный путь. Немного нового в Qt.

Это примерно тот макет, который я хочу повторить. У него есть две метки, lineedit и одна кнопка. Layout to be repeated

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

XML в Qt Creator предназначен для UI C в QMake для генерации кода для вас.
Например, QMake переводит ваш mainwindow.ui в ui_mainwindow.h и внутри вас найдет void setupUi(QMainWindow *MainWindow) с фактическим кодом, который создает и размещает виджеты.

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

Например, добавив 5 флажков для группы по коду:

QVBoxLayout *l = new QVBoxLayout(this);
ui->groupBox_4->setLayout(l);
for(int i=0; i<5; i++){
    QCheckBox *c = new QCheckBox(this);
    l->addWidget(c);
}
1 голос
/ 06 февраля 2020

Нет "хорошего" способа сделать это в 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"

enter image description here


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...