欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Qtsignal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

這篇文章主要介紹“Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么”,在日常操作中,相信很多人在Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、鯉城網(wǎng)絡(luò)推廣、重慶小程序開發(fā)公司、鯉城網(wǎng)絡(luò)營銷、鯉城企業(yè)策劃、鯉城品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供鯉城建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:aaarwkj.com

問題代碼:

sender.h

class Sender : public QObject
{
  Q_OBJECT
  public:
    explicit Sender(QObject *parent = nullptr);
    enum eResult {
      kSuccess,
      kFail,
    };
  signals:
    void loginResult(eResult result);
    void otherSignal(QString str);
};

定義了兩個信號:

  • loginResult() 這個信號采用 eResult 作為參數(shù),而 eResult 是 Sender 類內(nèi)部定義的類型;

  • otherSignal() 作為參照,使用Qt所定義的類型的信號。

receiver.h

class Receiver : public QObject
{
    Q_OBJECT
  public:
    explicit Receiver(QObject *parent = nullptr);

  signals:
  public slots:
    void onLoginResult(Sender::eResult result);
    void onOtherSignal(QString str);

  private:
    Sender *sender_;
};

在 Receiver 中定義了兩個slot分別接收 Sender 的兩個信號。

在 Receiver 的構(gòu)造函數(shù)中:

Receiver::Receiver(QObject *parent)
  : QObject(parent)
  , sender_(new Sender())
{
  connect(sender_, SIGNAL(loginResult(Sender::eResult)), this, SLOT(onLoginResult(Sender::eResult)));
  connect(sender_, SIGNAL(otherSignal(QString)), this, SLOT(onOtherSignal(QString)));
}

結(jié)果在運行時報錯:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

提示信號沒有連接上。

如果我們將 eResult 放到 Sender 類外面,則沒有這個問題。

這是為什么呢?

是不是只要是類內(nèi)部的類型都會出錯?

為了排除是我們自定義的枚舉的原因,我們把自己定義的 eResult 改成 MyString,其它也對應(yīng)改過來。

再試:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

結(jié)果還是報錯:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

這也證定了我的猜想。為是什么呢?

打開自動生成的 moc_sender.cpp 文件看看里面的內(nèi)容:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

如果我們再加一個signal:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

moc_sender.cpp 中會發(fā)生什么樣的變化呢?

(1)字面量里多出兩個新的字面量。

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

(2)在 qt_meta_data_Sender 中也多出些新的描述:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

可以看出,qt_meta_data_Sender 中可以描述出一個 QObject 類有哪些信號函數(shù)。每個信號函數(shù)的返回類型與參數(shù)各為什么。

從上可以看到,qt_meta_data_Sender 中記錄的信號自定義的參數(shù)類型idx指向的是 MyString。我們在 Receiver 中 connect() 使用的是 Sender::MyString。會不會是兩者對不上號導(dǎo)致的呢?

如果我們改成這樣:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

把 Sender:: 前綴加上。

看看會不會成功了呢?結(jié)果沒有再報錯了。

我們再來看看 moc_sender.cpp 的變化:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

猜想:

在下面的 connect() 代碼中:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

SIGNAL() 宏把  Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么 預(yù)編譯成 "loginResult(Sender::MyString)" 的字符串。在執(zhí)行時,就會拿著該字串去 Sender 對象中找信號名為 "loginResult" 參數(shù)個數(shù)只有一個,參數(shù)類型名為 "Sender::MyString" 的信號進行連接。

如果我們在 Sender 中將 loginResult 信號的參數(shù)類型寫成 MyString 而不是寫全 Sender::MyString,那么在 connect() 時,它就不能在 Sender 的 qt_meta_data_Sender 中找到這個信號,所以就失敗了。

如果我們還是采用原來的做法:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

而在 connect() 的地方,直接寫 MyString,而不寫成 Sender::MyString,如下:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

執(zhí)行報錯:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

說是不兼容的參數(shù)類型。

可能 connect() 函數(shù)在入口處,就對參數(shù)signal與slot的參數(shù)類型字串進行比較,如果不一致,那么就會認(rèn)為錯誤。

那反過來,我們在 connect() 時將 slot 的參數(shù)寫成:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

執(zhí)行結(jié)果:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

如果我們把 Receive::onLoginResult() 的參數(shù)類型改成 MyString 呢?

如下:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么 

編譯通過,運行時 connect() 正常。

是不是它只認(rèn)類型的名稱,不做類型推導(dǎo)呢?

我們大膽地做一個嘗試:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

我們給 MyString 亂指定一個類型。

結(jié)果編譯通過,運行時 connect() 正常。

從本質(zhì)上 MyString 就是 QString 的別名。

如果在 Receive 端使用 QString 替代 MyString 是不是就不能 connect() 成功了呢?

如下修改:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

編譯正常,運行結(jié)果:

Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么

這個實驗足于證明,connect() 只管類型名稱的比效,完全不做任何的類型推導(dǎo)。

綜上結(jié)論:

在執(zhí)行 QObject::connect() 時,它會對signal與slot參數(shù)的名稱進行對比,只有名稱完會一致的才能連接上,否會不失敗。

值得注意的是:它只管對類型的名稱進行比較,完全不會做任何的類型推導(dǎo)與類型檢查。

到此,關(guān)于“Qt signal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

網(wǎng)頁名稱:Qtsignal函數(shù)使用類內(nèi)部類型作為參數(shù)導(dǎo)致connect不成功的原因是什么
文章源于:http://aaarwkj.com/article16/jjgedg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)做網(wǎng)站、網(wǎng)站維護關(guān)鍵詞優(yōu)化、品牌網(wǎng)站設(shè)計、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
麻豆成人三级电影在线| 国产亚洲一区二区精品| 欧美日韩亚洲精品三级| 日韩精品国产一区二区在线观看| 亚洲一区二区四区乱码在线| 亚洲一区二区视频免费看| 日本一区二区三区加勒比| 日韩性视频激情在线一区| 国产午夜精品一区二区三区| 亚洲黄色一区大陆av剧情| 日本中文有码在线观看| 亚洲二区中文字幕在线观看| 日韩一二三区欧美四五区新| 麻豆视频国产一区二区| 精品一区二区三区乱码中文| 国产美女自拍视频一区| 四虎在线观看免费资源| 淫色网av人妻中文字幕| 一区二区三区高清av在线| 国产免费av一区二区在线观看| 亚洲亚洲精品av在线动| 国产精品成人亚洲一区二区| 日本在线最新视频一区二区三区| 亚洲男人av天堂东京热| 91啪在线观看91色| 国产美女作爱视频网站| 亚洲欧美制服另类国产| 日韩黄片一区二区三区| 国产一级三级视频在线| 精品福利视频蜜臀91| 亚洲综合偷拍欧美一区色| 久久国产亚洲精品赲碰热| 激情五月综合开心五月| 国产精品成人大片在线播放| 日本高清一区二区高清| av免费在线观看网页| 日韩在线国产精品一区| 日韩一区二区三区不卡| 亚洲一区制服无码中文| 国产精品国产亚洲精品看不| 熟女人妻视频一区二区|