查询QT ui文件定义的小部件的状态

查询QT ui文件定义的小部件的状态,qt,Qt,我有一个在QT设计器中创建的ui文件,我使用它在运行时使用QUiLoader类创建一个对话框。当对话框关闭时,是否可以查询此对话框中所有小部件的状态?我可以从根小部件遍历小部件层次结构,但我不知道在对话框关闭时如何触发此遍历。解决方案可能是为从QUiLoader加载的QWidget安装事件过滤器。在eventFilter方法中,您可以捕获隐藏事件(由接受或拒绝插槽的对话框触发)。 例如,头文件如下所示: MyApplicationObject.h #include <QObject>

我有一个在QT设计器中创建的ui文件,我使用它在运行时使用
QUiLoader
类创建一个对话框。当对话框关闭时,是否可以查询此对话框中所有小部件的状态?我可以从根小部件遍历小部件层次结构,但我不知道在对话框关闭时如何触发此遍历。

解决方案可能是为从
QUiLoader
加载的
QWidget
安装事件过滤器。在
eventFilter
方法中,您可以捕获隐藏事件(由接受或拒绝插槽的对话框触发)。 例如,头文件如下所示:

MyApplicationObject.h

#include <QObject>

class MyApplicationObject : public QObject
{
   Q_OBJECT

public:
   explicit MyApplicationObject(QObject *parent = 0);
   ~MyApplicationObject() {}

   bool eventFilter(QObject *object, QEvent *event);

private:
   QWidget *m_dialog;
};
#include <QFile>
#include <QtUiTools/QUiLoader>
#include "MyApplicationObject.h"

MyApplicationObject::MyApplicationObject(QObject *parent) :
   QObject(parent)
{
   QUiLoader loader;
   QFile file(":/dialogs/dialog1");
   file.open(QFile::ReadOnly);

   m_dialog = loader.load(&file);
   m_dialog->installEventFilter(this);

   file.close();

   m_dialog->show();
}

bool MyApplicationObject::eventFilter(QObject *object, QEvent *event)
{
   if (object == m_dialog) {
      if (event->type() == QEvent::Hide) {
         qDebug("Do something with dialog widget if dialog was accepted or rejected");
         return true;
      } else {
         return false;
      }
   } else {
      // Call base implementation
      return QMainWindow::eventFilter(object, event);
   }
}
#包括
类MyApplicationObject:公共QObject
{
Q_对象
公众:
显式MyApplicationObject(QObject*parent=0);
~MyApplicationObject(){}
bool事件过滤器(QObject*对象,QEvent*事件);
私人:
QWidget*m_对话框;
};
这里是实现文件:

MyApplicationObject.h

#include <QObject>

class MyApplicationObject : public QObject
{
   Q_OBJECT

public:
   explicit MyApplicationObject(QObject *parent = 0);
   ~MyApplicationObject() {}

   bool eventFilter(QObject *object, QEvent *event);

private:
   QWidget *m_dialog;
};
#include <QFile>
#include <QtUiTools/QUiLoader>
#include "MyApplicationObject.h"

MyApplicationObject::MyApplicationObject(QObject *parent) :
   QObject(parent)
{
   QUiLoader loader;
   QFile file(":/dialogs/dialog1");
   file.open(QFile::ReadOnly);

   m_dialog = loader.load(&file);
   m_dialog->installEventFilter(this);

   file.close();

   m_dialog->show();
}

bool MyApplicationObject::eventFilter(QObject *object, QEvent *event)
{
   if (object == m_dialog) {
      if (event->type() == QEvent::Hide) {
         qDebug("Do something with dialog widget if dialog was accepted or rejected");
         return true;
      } else {
         return false;
      }
   } else {
      // Call base implementation
      return QMainWindow::eventFilter(object, event);
   }
}
#包括
#包括
#包括“MyApplicationObject.h”
MyApplicationObject::MyApplicationObject(QObject*父对象):
QObject(父对象)
{
装载机;
QFile文件(“:/dialogs/dialog1”);
打开(QFile::ReadOnly);
m_dialog=loader.load(&file);
m_对话框->installEventFilter(此);
file.close();
m_对话框->显示();
}
bool MyApplicationObject::eventFilter(QObject*对象,QEvent*事件)
{
如果(对象==m_对话框){
如果(事件->类型()==QEvent::Hide){
qDebug(“如果对话框被接受或拒绝,则对对话框小部件进行处理”);
返回true;
}否则{
返回false;
}
}否则{
//呼叫基础实现
返回QMainWindow::eventFilter(对象、事件);
}
}

有点像Java Swing的API?由于QWidget是一个QObject,所以您应该能够访问成员函数。我可以访问子对象。真正的问题是如何触发遍历。我已经考虑过信号和动作,但我在画空白。哦,我现在明白了,是的,信号(closing())或者你说的什么听起来像是要走的路。除非你扩展了QDialog类!不,我没有扩展dialog类。此外,不管我如何措辞我的问题,不是所有的ui文件都有一个顶级对话框对象。因此,不能保证关闭()信号。