簡體   English   中英

Qt信號和插槽:權限

[英]Qt signals and slots: permissions

SO上的尊重答案與實際的Qt文檔之間存在差異。

我已經閱讀了這個問題 ,我想進一步澄清一下。 有人可以證實:

  • 信號始終protected ,因此只能由類或其任何子類發出。 我不確定這是真的; 上面的問題顯示了支持這一陳述的答案。 Qt文檔說: Signals are public access functions and can be emitted from anywhere, but we recommend to only emit them from the class that defines the signal and its subclasses. 那是哪個呢?
  • 插槽只是功能,因此可以是公共的,私有的或受保護的。 顯然,如果插槽是公共的,那么外部類能夠控制您的類是否將其自身信號之一連接到其自己的插槽之一。 然而,SO信息再次與文檔不同,文檔說: a signal emitted from an instance of an arbitrary class can cause a private slot to be invoked in an instance of an unrelated class. 這意味着private信號/插槽機制不受尊重?
  • 單詞public,private,protected與使用signal關鍵字無關
  • 發出的信號始終可用於所有其他類,也就是說,任何其他類可能始終連接到該信號(無論其發出信號的權限如何)。
  • 盡管所有類都可以查看所有信號,但由於connect函數將類名作為信號前綴(即SomeClass::itsSignal ),因此您仍然可以使用兩個具有相同名稱信號的類。
  • 信號在Qt4中受到保護,但在Qt5中是公開的,因此是相互矛盾的信息。
  • 插槽是函數,public / protected / private在調用它們時受到尊重,當連接到信號時,元對象系統會忽略它。
  • 由於signals被定義為public:用例如私人信號引導它們

至:

private:
public: //signals:
    void theSignal();

因此它沒有效果。

  • 所有類都可以連接到任何信號,正確。 在這方面,信號是公共API的一部分。
  • 具有相同的信號簽名不是問題。 上下文由指定為sender的對象定義。

使用舊式連接:

Apple *apple ... Orange* orange
connect(apple, SIGNAL(changed()), this, SLOT(appleChanged()));
connect(orange, SIGNAL(changed()), this, SLOT(orangeChanged()));

信號在這里被指定為字符串(沒有其中的類名),但由於appleorange只有一個信號已changed() ,並且查找是在QObject實例的元對象中完成的,每個類都存在一個(不是實例) ),他們不能碰撞。

帶編譯時檢查的Qt 5版本:

connect(apple, &Apple::changed, this, &MyReceiver::appleChanged);

這里必須指定一個函數,因此根據范圍,必須指定一個類名(可能還有名稱空間)。 由於一個模糊的函數名稱不是有效的C ++,因此不能編譯,所以這里安全。

看看qobjectdefs.h (QT5.0 +)。 在那里定義了moc宏

#     define signals public

如您所見,信號頭文件中使用的宏被定義為public。 至於顯式statet public,private,protected指令,這些指令在信號部分被忽略。 之前5.0版本的QT將信號定義為受保護。 那些仍然可用於使用SIGNAL()宏的連接。

插槽宏

#     define slots

被定義為空宏,因此可以用於:

public slots:
private slots:
protected slots:

方法可見性用於直接方法調用,因此不能直接從外部類調用private / protected。

使用connect語句仍然可以獨立於可見性。 這是預期的行為,並在moc生成的代碼中實現。

如果我在早期版本的Qt中記得正確,那么一個插槽也是自動public ,但我現在沒有找到它的參考。

任何其他類都可以連接到來自外部類的信號,只要在類中給出Q_OBJECT宏並且已知外部類(包括頭部)。 由於信號是按類定義的,因此在不同的類中使用相同的信號是完全合法的。 這也很方便,例如在所有類中都有一個信號sendInfo(QString)使它更容易記憶。 Q_OBJECT宏使moc創建將信號連接到獨立於可見性的插槽所需的代碼。

發出的信號始終可用於所有其他類,也就是說,任何其他類可能始終連接到該信號(無論其發出信號的權限如何)。

在Qt5中,這不一定是真的。 可以使用QPrivateSignal作為其最終參數來定義信號,在這種情況下,只有聲明信號的對象才能連接到它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM