2012-06-21 145 views
0

使用Qt我知道private slots意味着插槽是直接調用時是私有的,但connect()仍然可以允許信號連接到插槽,無論是私有的,公共的還是I猜測,保護。防止連接到一個插槽(「真的」專用插槽)

那麼,有沒有一種方法,使一個插槽真正的私有,這樣只有一個類中的一個連接可以做什麼?我在這裏想的是因爲QTimer::singleShot,它調用一個插槽,但我想打電話的功能,我不想在課堂以外訪問。我相信還有其他原因,但這是目前我發現的主要原因。

+4

誰在乎,如果是私人或不?你害怕一些邪惡的人會故意打電話嗎? –

+2

@BlaXpirit我很欣賞評論。也許這只是我的一個強迫症,但我想盡可能消除任何錯誤的可能性,我覺得這將是一個很好的編程習慣。這不是關於人們打電話的目的,而是關於防止人們意外故障並減少錯誤的可能性。另外,我很好奇,如果有可能的話。總是好的嘗試和學習新技術,我認爲:-) – Firedragon

+0

不幸的是這一切的是反正實際意義,因爲如果你真的* *想調用前訪問私有成員,你可以'#定義私人public'。至於這個特定的問題,私有/公共/受保護的訪問是C++的編譯時功能,信號/插槽是運行時功能,到那時公共和私有概念不存在。 – Elliott

回答

2

如果你真的要執行這一點,你不認爲適當的文件將解決這個問題,該插槽添加到一個額外的類,它有一個私人的構造和中繼呼叫您的真實類。

class PrivateSlotClass : public QObject 
{ 
Q_OBJECT 
friend class YourRealClass; 
PrivateSlotClass(YourRealClass) : QObject(YourRealClass){} 
private slots: 
    void theSlot(){ static_cast<YourRealClass*>(parent())->theFunction(); 
}; 

class YourRealClass : public QObject 
{ 
public: 
    YourRealClass(); 
friend class PrivateSlotClass; 
private: 
void theFunction(); 
}; 

YourRealClass::YourRealClass(){ 
    PrivateSlotClass* myPrivateSlot = new PrivateSlotClass(this); 
    QTimer::singleShot(50, myPrivateSlot, SLOT(theSlot())); 
} 
void YourRealClass::theFunction() 
{ 
/* your slot code here */ 
} 
+0

感謝您的信息。我確實承認你在文檔中提到的關於文檔的內容,說實話,我更願意這樣做,因爲解決這個問題的辦法太多了,而且收效甚微。無論如何,我從理論的角度來看這種興趣。 – Firedragon

2

只需使用timerEventstartTimer而不是插槽和QTimer :: singleShot。

+0

+1。如果您不希望API公開(通過元對象),請勿使用「slots」。 [鏈接](http://qt-project.org/forums/viewthread/3610) – azf

0

我認爲這是可以添加更多的這樣的說法你的插槽和相應的信號:

... 
private slots: 
    void slot(..., QObject* sender = 0); 
... 

void YourClass::slot(..., QObject* sender) 
{ 
    if (sender != (QObject*)this) 
    { 
     /* do nothing or raise an exception or do whatever you want */ 
    } 
    ... 
} 

當然它不會讓你的槽「完全」私有的,但它贏得了」不要讓您的代碼在接收到來自對象外部的信號後執行。

+1

的QObject有一個'寄件人()'函數,就不必爲額外的參數,或有人只是欺騙參數的可能性。 – Chris

+0

這不允許該類的一個實例向該類的另一個實例發送信號,因此它實際上比私有更具限制性。 – Elliott