如何识别qt中的对象?

时间:2017-03-23 01:40:19

标签: c++ qt dialog

/* Dialog Class */
class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);

    //void displayDialog(QString arg);    //外界字符串传入到textEdit中

    ~Dialog();

private:
    Ui::Dialog *ui;
};

/* MainWindow.cpp */
Dialog *dlg = new Dialog;
Dialog *dlg2 = new Dialog;

我基于Dialog Class创建了两个对象,如果我不知道变量* dlg和* dlg2,如何识别这两个对话框?

2 个答案:

答案 0 :(得分:0)

识别任何QObject的典型方法是使用Qobject的{​​{3}}属性。

这在测试中非常常用,我们可以将其视为objectNamefindChild中使用的主要身份识别形式。

修改

一般来说,所有对象都将由主窗口拥有。这允许Qt为您处理很多事情。一些关于如何重要的简单示例:

  1. 如果我破坏了我的主窗口,我的所有孩子也将被销毁,所以在主窗口关闭后我不会弹出窗口
  2. 弹出一个窗口将从主窗口窃取焦点,如果它是一个阻止对话框,它将阻止其当前层次结构中的任何其他内容被激活
  3. 显然,在这里找东西很重要
  4. 请注意,所有这些功能都贯穿整个层次结构。也就是说,如果我有一个由QObject拥有的QDialog由主窗口所拥有,那么当QObject将在主窗口被销毁时将被销毁,层次结构中的其他对象,可以通过从主窗口开始搜索找到。

    不是2个无关联的弹出窗口,而是让2个弹出窗口由主窗口拥有:

    QMainWindow mainWin;
    QDialog dlg(&mainWin);
    QDialog dlg2(&mainWin);
    
    dlg.setObjectName("two");
    
    QDialog* dfind = mainWin.findChild<QDialog*>("two");
    

答案 1 :(得分:0)

如果您的对话框中没有任何父级(parent == nullptr),您可以迭代所有窗口并比较它的对象名称。

QWidget* GetWidgetByObjectName(const QString& Name) {
    QGuiApplication* a = dynamic_cast<QGuiApplication*>(QCoreApplication::instance());
    if (a) {
        for (QWidget* w : a->allWidgets()) {
            if (w->objectName() == Name) {
                return w;
            }
        }
    }
    return nullptr;
}
QDialog* Dlg = qobject_cast<QDialog*>(GetWidgetByObjectName("two"));

但是,在大多数情况下,最好分配父母。在这种情况下,您可以迭代已经发布的所有孩子。