使用Qt我知道private slots
意味着插槽是直接調用時是私有的,但connect()
仍然可以允許信號連接到插槽,無論是私有的,公共的還是I猜測,保護。防止連接到一個插槽(「真的」專用插槽)
那麼,有沒有一種方法,使一個插槽真正的私有,這樣只有一個類中的一個連接可以做什麼?我在這裏想的是因爲QTimer::singleShot
,它調用一個插槽,但我想打電話的功能,我不想在課堂以外訪問。我相信還有其他原因,但這是目前我發現的主要原因。
使用Qt我知道private slots
意味着插槽是直接調用時是私有的,但connect()
仍然可以允許信號連接到插槽,無論是私有的,公共的還是I猜測,保護。防止連接到一個插槽(「真的」專用插槽)
那麼,有沒有一種方法,使一個插槽真正的私有,這樣只有一個類中的一個連接可以做什麼?我在這裏想的是因爲QTimer::singleShot
,它調用一個插槽,但我想打電話的功能,我不想在課堂以外訪問。我相信還有其他原因,但這是目前我發現的主要原因。
如果你真的要執行這一點,你不認爲適當的文件將解決這個問題,該插槽添加到一個額外的類,它有一個私人的構造和中繼呼叫您的真實類。
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 */
}
感謝您的信息。我確實承認你在文檔中提到的關於文檔的內容,說實話,我更願意這樣做,因爲解決這個問題的辦法太多了,而且收效甚微。無論如何,我從理論的角度來看這種興趣。 – Firedragon
只需使用timerEvent和startTimer而不是插槽和QTimer :: singleShot。
+1。如果您不希望API公開(通過元對象),請勿使用「slots」。 [鏈接](http://qt-project.org/forums/viewthread/3610) – azf
我認爲這是可以添加更多的這樣的說法你的插槽和相應的信號:
...
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 */
}
...
}
當然它不會讓你的槽「完全」私有的,但它贏得了」不要讓您的代碼在接收到來自對象外部的信號後執行。
誰在乎,如果是私人或不?你害怕一些邪惡的人會故意打電話嗎? –
@BlaXpirit我很欣賞評論。也許這只是我的一個強迫症,但我想盡可能消除任何錯誤的可能性,我覺得這將是一個很好的編程習慣。這不是關於人們打電話的目的,而是關於防止人們意外故障並減少錯誤的可能性。另外,我很好奇,如果有可能的話。總是好的嘗試和學習新技術,我認爲:-) – Firedragon
不幸的是這一切的是反正實際意義,因爲如果你真的* *想調用前訪問私有成員,你可以'#定義私人public'。至於這個特定的問題,私有/公共/受保護的訪問是C++的編譯時功能,信號/插槽是運行時功能,到那時公共和私有概念不存在。 – Elliott