如何从qt5中的.ui文件中读取小部件?

时间:2014-02-05 09:34:31

标签: qt qt5 qt-designer

我正在尝试从.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文件中的小部件。 我怎样才能实现它? 谢谢你。

1 个答案:

答案 0 :(得分:2)

创建QUiLoader的子类,然后重新实现createWidgetcreateLayoutcreateAction(还有createActionGroup,但它是'除非您手动编辑ui文件,否则不再支持。

每次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;
   }
};