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

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精品精品国产自 | 国产精品伊人久久精品| 日韩欧美一区二区大片| 日本高清久久一区二区三区| 清纯唯美亚洲自拍第一页| 午夜一区二区精品视频国产| 国产高清大片一级黄色| 密臀精品国产一区二区| 日本欧美精品一区二区精选| 青青草成人免费在线公开视频| 91精品麻豆国产自产在线| 国产精品va在线观看入口| 亚洲国产精品综合色在线| 午夜美女精品福利视频| 成年人午夜看片免费网站| 国产三级在线视频不卡| 麻豆国产精品原创av男女| 日韩电影在线播放中文字幕| 国产成人三级在线影院| 中文字幕精品一区二区三区视频| 国产一区二区三区高潮爽| 97视频免费观看在线| 免费看国产一级黄色大片| 成人性生交大片免费看久久| 色哟国产传媒视频在线观看| 男人天堂av在线资源| 国产精品一区二区久久毛片| 亚洲av天堂免费在线观看| 亚洲夫妻性生活免费视频| 国产传媒剧情剧资源网站| 久久av一区二区三区.| 国产操大奶头女人自拍av| 亚洲一二三区精品与老人| 久久亚洲欧洲日本韩国欧美| 欧美日韩免费r在线视频| 福利av一区二区三区| 国产原创中文剧情性感av| 欧美午夜一级特黄大片| 亚洲综合日韩精品在线| 久久精品欧美日韩视频| 日韩精品免费在线观看视频网站|