Как читать виджеты из файла .ui в qt5?

Я пытаюсь получить список виджетов из файлов .ui. Итак, вот немного кода:

    QUiLoader loader;
     QFile file(fname);
     file.open(QFile::ReadOnly);
     QWidget *myWidget = loader.load(&file, this);
     file.close();

     QStringList avlb_wd = loader.availableWidgets();
     QMessageBox msg;

     foreach (const QString &str, avlb_wd)
     {
        msg.setText(str);
        msg.exec();
     }

Но, как я вижу, availableWidgets() дает мне все виджеты, а не те, которые находятся в файле .ui. Как я могу достичь этого? Спасибо вперед.


person amol01    schedule 05.02.2014    source источник


Ответы (1)


Создайте подкласс QUiLoader и повторно реализуйте createWidget, createLayout и createAction (есть также createActionGroup, но на самом деле он больше не поддерживается, если только вы не отредактируете файл ui вручную).

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

ОБНОВЛЕНИЕ:

Таким образом, базовый подкласс QUiLoader будет выглядеть так (при необходимости добавьте другие перегрузки):

class UiLoader : public QUiLoader
{
   Q_OBJECT
public:
   UiLoader(QObject *parent = 0) : QUiLoader(parent) { }

   virtual QWidget* createWidget(const QString &className,
   QWidget *parent = 0, const QString &name = QString())
   {
      QWidget* widget = QUiLoader::createWidget(className, parent, name);
      // do stuff with className, name, widget, etc
      return widget;
   }
};
person ekhumoro    schedule 05.02.2014
comment
Привет, я новичок в среде Qt. Не могли бы вы показать мне, как создать подкласс и повторно реализовать вышеуказанные функции? Или дайте мне ссылку на документы, где я могу найти информацию о том, как это сделать? Некоторые примеры были бы действительно полезны. Спасибо, в любом случае. - person amol01; 07.02.2014
comment
@user3185491. Я добавил немного кода, чтобы вы начали, но на самом деле это очень простой материал C++. - person ekhumoro; 07.02.2014