[英]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.
那是哪個呢? 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
信號/插槽機制不受尊重? signal
關鍵字無關 connect
函數將類名作為信號前綴(即SomeClass::itsSignal
),因此您仍然可以使用兩個具有相同名稱信號的類。 signals
被定義為public:
用例如私人信號引導它們 至:
private:
public: //signals:
void theSignal();
因此它沒有效果。
使用舊式連接:
Apple *apple ... Orange* orange
connect(apple, SIGNAL(changed()), this, SLOT(appleChanged()));
connect(orange, SIGNAL(changed()), this, SLOT(orangeChanged()));
信號在這里被指定為字符串(沒有其中的類名),但由於apple
和orange
只有一個信號已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.