2017-02-16 5 views
0

私は多くのウィンドウ(QWidgets)を持つアプリケーションを持っています。 開いているウィンドウのリストは保存しませんでしたので、ウィンドウを閉じるたびに取得する必要があります。"this"をQ_Slotに渡すことはできますか?

特に、これらのウィンドウのそれぞれはSubWindowと呼ばれます。 すべてのSubWindowクラスには、MultiEditor * sEditorsを含むレイアウトが含まれています.Editorsには、現在のウィンドウを閉じるアクションを含むメニューがあります。 すべてのSubWindowは、MainWindow内で作成されます。

私には2つの計画があります。 1)サブウィンドウコンストラクタに

connect(sEditors, SIGNAL(closeWindow()), 
     main, SLOT(closeWindow(this))); 
を添加することにより、メインウィンドウのクラスの中からサブウィンドウ破壊)サブウィンドウコンストラクタに

connect(sEditors, SIGNAL(closeWindow()), 
     this, closeWindow())); 

又は

2を添加することにより、自身の中からサブウィンドウ破壊

約1)、私は自分自身からQWidgetを閉じて破壊する方法を理解していません(これを削除してください;は動作していませんでしたが、もう一度やり直すことができます)。

約2)私のSLOT(closeWindow(this))はトリガーされていないようですので、 "this"を引数として渡すことができますか?

答えて

0

広告1)QObject::deleteLater()を使用できます。これは次のイベントループサイクルでオブジェクトを破壊し、このような状況のために特別に作成します

広告2)信号スロット接続では、実際の引数をパラメータとして渡すことはできません。 スロット内のsender()機能を使用して、信号を発信した人を見つけることができます。あなたの場合、それはsEditorsオブジェクトでしょう。

その他のオプション:

3)あなたはサブウィンドウにあなたの編集者からの信号をマッピングするためにQSignalMapperを使用することができます。

4)(あなたはあなたのサブウィンドウでラムダ接続を使用することができますQt5/C++ 11)の使用:

connect(sEditors, SIGNAL(closeWindow()), [this]() {this->closeWindow();}); 
+0

私deleteLater)が働いていないされていません。私はcloseWindow()内でそれをトリガーし、私のQWidgetは残っています - >それは消えません。 –

+0

間違ったウィジェットを閉じる/削除/隠しているようですが、閉じる()[またはthis-> close()]またはhide()[this-> hide()]を記述してもQWidgetは消えません。 'this'があなたのデバッガであなたのスロットの正しいオブジェクトを指していることを確認してください –

+0

非常に、ありがとう! –

0

私はQtのスロットにthisを渡すことはできますか?

スロットは非スタティックな方法なので、すでにthisにアクセスできます。あなたが参照するthisは、QObject::connectの3番目の引数です。 Qt 4の構文では、3番目の引数を自由に省略できます。デフォルトはthisです。しかし、Qt 5の構文では、明示的に記述する必要があります。

私はQObject::deleteLater()を使用し、私は自分自身の中から任意のQObjectを削除するには

自体からのQWidgetを閉じて破壊することができますどのように理解していません。 QWidgetLSPとして-QObjectであることを想起してください。

私SLOT(closeWindowは(これは))

そのようなスロットが(私たちにそのドキュメントへのリンクを与える:あなたはできません)ありません

トリガされていないようだ、とあなたのスロットの署名をスロットシグネチャのカッコ内の唯一のものがタイプになる可能性があり、 thisはタイプではないため無効です。 SLOT(slotName(TYPE_LIST_HERE)) SLOT(mySlot(int,QString))

、ウィジェットを閉じてそのclose()スロットを使用するには:まだ

connect(sEditors, SIGNAL(closeWindow()), this, SLOT(close()); 

は、Qtの4 connect構文を使用して、実行時に検出されるべきコーディングミスを残している - と、あなたが払っていない場合実行時のデバッグ出力に注意してください。それは、(Qtの5)新しいconnect構文を使用することがはるかに良いですし、コンパイラはあなたのためのエラーを検出しましょう:

connect(sEditors, &MultiEditor::closeWindow, this, &QWidget::close); 

残念ながら、しっかりと結合させる必要がSubWindowcloseWindowを送信したオブジェクトがありません - 少なくともありませんSubWindow::SubWindow()内にあります。代わりに、エディタを作成する場所に接続することができます。

閉鎖時にウィジェットを削除するには、その上にQt::WA_DeleteOnClose属性を設定して、Qtにそれをさせるだけです。あなたはファクトリメソッドにそれのすべてを考慮可能性が明示など

deleteLaterを呼び出す必要:(、(私が知らないことを)何らかの理由で

template <class T> T* SubWindow::makeEditor() { 
    auto sub = new T{this}; 
    sub->setAttribute(Qt::WA_DeleteOnClose); 
    connect(sEditor, &MultiEditor::closeWindow, sub, &QWidget::close); 
    return sub; 
} 

MainWindow::MainWindow(/*...*/) : /*...*/ { 
    makeEditor<EditorType1>(); 
    makeEditor<EditorType2>(); 
    /*...*/ 
} 
+0

Qt5の構文は非常に便利です、ありがとう!何らかの理由で(わからない)、私のdeleteLater()が動作していません。私はcloseWindow()関数内でそれをトリガし、私のQWidgetは残っています - >消えることはありません。 close()[またはthis-> close()]またはhide()[this-> hide()]を記述したり、connect(sEditors、&MultiEditor :: closeWindow、this)を記述してもQWidgetは消えません。 &QWidget :: close); –

関連する問題