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