技術部落格003

2021-08-02 09:18:41 字數 3593 閱讀 7651

從qobject(qobject.h)原始碼中可以看到qobject::connect的定義是這樣的:

[cpp] view plain copy

static bool connect(const qobject *sender, const char *signal,

const qobject *receiver, const char *member, qt::connectiontype =

#ifdef qdoc

qt::autoconnection

#else

#ifdef qt3_support

qt::autocompatconnection

#else

qt::autoconnection

#endif

#endif

);

inline bool connect(const qobject *sender, const char *signal,

const char *member, qt::connectiontype type =

#ifdef qdoc

qt::autoconnection

#else

#ifdef qt3_support

qt::autocompatconnection

#else

qt::autoconnection

#endif

#endif

) const;

其中第二個connect的實現其實只有一句話:

[cpp] view plain copy

所以對於connect函式的學習其實就是研究第乙個connect函式。

我們在使用connect函式的時候一般是這樣呼叫的:

[cpp] view plain copy

connect(sender,signal(signal()),receiver,slot(slot()));

這裡用到了兩個巨集:signal() 和slot();通過connect宣告可以知道這兩個巨集最後倒是得到乙個const char*型別。

在qobjectdefs.h中可以看到signal() 和slot()的巨集定義:

[cpp] view plain copy

#ifndef qt_no_debug

# define qlocation "\0"__file__":"qtostring(__line__)

# define method(a) qflaglocation("0"#a qlocation)

# define slot(a) qflaglocation("1"#a qlocation)

# define signal(a) qflaglocation("2"#a qlocation)

#else

# define method(a) "0"#a

# define slot(a) "1"#a

# define signal(a) "2"#a

#endif

所以這兩個巨集的作用就是把函式名轉換為字串並且在前面加上識別符號。

比如:signal(read())展開後就是"2read()";同理slot(read())展開後就是"1read()"。

[cpp] view plain copy

connect(sender,signal(signal()),receiver,slot(slot()));

實際上就是connect(sender,「2signal()」,receiver,「1slot())」;

搞明白了實際的引數就可以來看connect的真正實現過程了,在qobject.cpp檔案中可以找到connect的實現**。

[cpp] view plain copy

bool qobject::connect(const qobject *sender, const char *signal,

const qobject *receiver, const char *method,

qt::connectiontype type)

; if (qinternal::activatecallbacks(qinternal::connectcallback, (void **) cbdata))

return true;

} if (sender == 0 || receiver == 0 || signal == 0 || method == 0)

qbytearray tmp_signal_name;

if (!check_signal_macro(sender, signal, "connect", "bind"))

return false;

const qmetaobject *smeta = sender->metaobject();

const char *signal_arg = signal;

++signal; //skip code

int signal_index = smeta->indexofsignal(signal);

if (signal_index < 0)

} qbytearray tmp_method_name;

int membcode = extract_code(method);

if (!check_method_code(membcode, receiver, method, "connect"))

return false;

const char *method_arg = method;

++method; // skip code

const qmetaobject *rmeta = receiver->metaobject();

int method_index = -1;

switch (membcode)

if (method_index < 0)

} if (method_index < 0)

if (!qmetaobject::checkconnectargs(signal, method))

int *types = 0;

if ((type == qt::queuedconnection || type == qt::blockingqueuedconnection)

&& !(types = queuedconnectiontypes(smeta->method(signal_index).parametertypes())))

return false;

qmetaobject::connect(sender, signal_index, receiver, method_index, type, types);

const_cast(sender)->connectnotify(signal - 1);

return true;

}

Docker 網路 劉珂003的部落格

docker安裝時會自動在host上建立三個網路,用docker network ls 命令檢視 1.none 網路顧名思義,none網路就是什麼都沒有的網路,掛載這個網路下的容器除了lo,沒有其他任何網絡卡,容器建立時,可以通過 network none 指定使用none網路 應用場景 一些對安全...

2011 11 9技術部落格

現在已近是開學第十一周了,但正式上課菜才三周,上一周主要學了c 的一些基本程式設計。有三種基本結構,順序,分支,和迴圈。重點學了分支結構設計,if語句和switch語句。我覺得if語句還是挺簡單的,無非就兩種if 表示式1 語句1 else if 表示式2 語句2 else else 語句n 要注意...

技術部落格1

connect,是qt 中的連線函式 將訊號傳送者sender物件中的訊號signal與接受者receiver中的member槽函式 聯絡起來。qobject connect的定義是這樣的 static bool connect const qobject sender,const char sig...