2017-03-23 18 views
0
/* 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; 

私はダイアログクラスに基づいて2つのオブジェクトを作成しますが、変数* dlgと* dlg2がわからない場合、これらの2つのダイアログをどのように識別できますか?Qtでオブジェクトをどのように識別できますか?

+0

ポインタに割り当てずに作成する方法は? –

答えて

0

QObjectを識別する一般的な方法は、QobjectobjectNameプロパティを使用することです。

これはテストで非常に一般的に使用されており、findChildfindChildrenで使用されている識別の主な形式と見ることができます。

EDIT:

だから一般的に言えば、すべてのオブジェクトは、メインウィンドウが所有しようとしています。これは、Qtがあなたのために多くのことを処理することを可能にします。これが重要であるかのいくつかの簡単な例:

  1. 私は私のメインウィンドウを破棄した場合は、すべて私の子供たちも破壊されますので、私のメインウィンドウがPoping
  2. を閉じた後、私はぶらぶらポップアップを持っていません。そのすべてのこれらの機能の機能を注意してくださいあまりにも

  • 活性化されることから、現在の階層が明らかなものを見つけることがここで重要なのウィンドウは、メインウィンドウからフォーカスを盗むだろう、それがブロックダイアログの場合、それはそれで何かを防ぐことができます階層全体を通してつまり、メインウィンドウが所有するQDialogによって所有されているQObjectがある場合、このQObjectは、メインウィンドウが破壊され、階層内の他のオブジェクトからフォーカスを奪い、検索することによって見つけることができますメインウィンドウから開始します。あなたのダイアログがあなたの例のように任意の親(親== nullptr)を持っていない場合は、次のことができ

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

    あなたの答えに感謝します!私はこのようにしました: 'Dialog * dlg = new Dialog; ダイアログ* dlg2 =新規ダイアログ。 dlg2-> setObjectName(QString :: fromUtf8( "two")); ダイアログ* dfind = this-> findChild

    (「2」); ' エラーあなたはダイアログの子供をしなければならないfindChild''使用したい場合は –

    +1

    @Amor_aeternus「をfindSubDialog.exeは動作を停止しました」であります'Dialog * dlg = new Dialog(this);'これがなければ 'dfind'は' NULL'になり、あなたがアプリケーションを使用しようとするとクラッシュします。 –

    +0

    @Amor_aeternus共通のオーナーのない2つの 'QDialog'のデザインはせいぜい問題になります。よく設計されたQtプログラムは、プログラム内の他のすべての 'QObject'を直接的または間接的に所有する単一の' QObject'を常に持っているという主な理由のいくつかを使って、私の答えを更新しました。私はまた、うまく設計されたQtプログラムで検索がどのように機能するのかを実証しました。あなたに質問がある場合はお知らせください。 –

    0

    よりもむしろ2つの関連付けられていないポップアップは、メインウィンドウが所有している2つのポップアップを行うことができますすべてのウィンドウを繰り返し、そのオブジェクト名を比較します。

    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")); 
    

    しかし、ほとんどの場合、親を割り当てる方が良いです。この場合、既にここに投稿されているように、すべての子どもを繰り返し処理することができます。

    関連する問題