QT / C ++ - еще одна проблема с доступом к файлам пользовательского интерфейса - PullRequest
0 голосов
/ 15 января 2012

Хотя я прочитал ответы на этот вопрос

QT / C ++ - Доступ к интерфейсу MainWindow из другого класса и довольно долго искал весь www - я нене получается это работает.

Мне было дано задание воссоздать пользовательский интерфейс приложения с использованием QT Designer.К сожалению, уже был некоторый пользовательский интерфейс, разбросанный по нескольким классам (тогда команда столкнулась с идеей, что использование QT, но не использование Designer, хотя «ручное кодирование» пользовательского интерфейса, кажется, не имеет смысла)

Так что теперь моя работаэто распутать открытые концы, создать графический интерфейс (все готово), найти все возможные сигналы и слоты и собрать их все вместе, чтобы они выглядели красиво и чисто.

Так много для теоретической части.

Дополнение: У меня очень мало опыта в C ++, и мне кажется, что я никуда не ищу ответы и у меня нет времени читать целые книги дозавтра, иначе я бы не стал спрашивать.

Я схожу с ума по поводу двух вещей:

A) Мои mainwindow.cpp, mainwindow.h и mainwindow.ui должны быть связаны вдругие файлы, например previewwidget.cpp ... в previewwidget.cpp было много кода, например:

 buttonLayout->addWidget(fpsSpinBox, 0, Qt::AlignCenter);
 buttonLayout->addWidget(playButton, 0, Qt::AlignCenter);
 buttonLayout->addWidget(backwardButton, 0, Qt::AlignCenter);

, очевидно, я заменил его, создав соответствующие кнопки в Designer.теперь в том же файле есть записи подключения SIGNAL SLOT (я добавил "ui ->")

 connect(ui->playButton, SIGNAL(clicked()), this, SIGNAL(playButtonClicked()));
 connect(ui->stopButton, SIGNAL(clicked()), this, SIGNAL(stopButtonClicked()));
 connect(ui->forwardButton, SIGNAL(clicked()), this, SIGNAL(forwardButtonClicked()));

, но компилятор постоянно говорит мне:

\ preview \ previewwidget.cpp: 77: Ошибка: 'ui' не был объявлен в этой области

Я поместил ui_mainwindow.h в заголовок, но это тоже не было решением.


B) Этот вопрос, вероятно, очень тесно связан с первым: поскольку конструктор жестко разделяет модель / представление / элемент управления, мне нужно переписать сигналы и слоты в соответствии с новым пользовательским интерфейсом - кто-нибудь получилхороший учебник или какие-либо подсказки для меня, как сделать это быстро и несложно?

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 15 января 2012

Предположим, у вас есть класс с именем MyWidget и соответствующий ui файл MyWidget.ui. Чтобы использовать его в вашем классе, я бы сделал следующее:

  • В MyWidget.ui установите значение objectName. Это первое свойство в редакторе свойств, если вы открываете файл в конструкторе. Я бы назвал это MyWidget

  • В MyWidget.h необходимо выполнить следующее:

    • Объявите пространство имен для объекта пользовательского интерфейса и затем объявите его.
    • Добавить в качестве переменной-члена (private) указатель на объект пользовательского интерфейса.

Пример файла заголовка следующий:

#ifndef MY_WIDGET_H_
#define MY_WIDGET_H_

#include <QWidget>

namespace Ui {
    class MyWidget;
}

class MyWidget : public QWidget {
   Q_OBJECT
public:
   MyWidget(QWidget* parent = NULL);
   ~MyWidget();

   // Add other class functions
private:
   Ui::MyWidget ui;
}   

#endif // MY_WIDGET_H_
  • В MyWidget.cpp
    • Включить автоматически сгенерированный ui_MyWidget.h
    • Создать новый объект пользовательского интерфейса в конструкторе
    • вызов функции setupUi в конструкторе
    • Удалить пользовательский интерфейс в деструкторе

Пример кода:

#include "MyWidget.h"
#include "ui_MyWidget.h"

MyWidget::MyWidget(QWidget *parent)
:QWidget(parent), ui(new Ui::MyWidget)
{
    ui->setupUi(this);
}

MyWidget::~MyWidget()
{
    delete ui;
}

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

int val = ui->spinBox1->value();

.ui Сигналы и слоты

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

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

  1. Переключение в режим редактирования сигналов / слотов (F4)
  2. Перетащите из виджета, из которого он излучает сигнал, в виджет, который должен получить сигнал.
  3. Появится диалоговое окно «Настроить соединение», в котором отображаются сигналы для отправляющего виджета и слоты для принимающего виджета. Нажмите Отредактируйте ... под столбцом слотов справа.
  4. Появляется диалоговое окно Signals / Slots of ReceivingWidget. Здесь можно щелкнуть значок плюса под слотами, чтобы добавить новый слот любое имя.
  5. Затем вы можете вернуться и подключиться к вашему новому слоту в диалоге Configure Connection или даже в редакторе сигналов / слотов. Вернуть док в главное окно.
...