簡體   English   中英

Qt Connect事件到非QObject類型

[英]Qt Connect Event to non-QObject Types

我有一個數據模型對象,其對象旨在處理Qt事件。 但是,當我嘗試將事件處理程序連接到此方法時,出現編譯時錯誤。 問題在於, connect模板最終會對第四個參數執行static_cast<void (QObject::*)(double)> 由於我的數據模型不繼承自QObject ,因此此代碼生成錯誤C2664:

指向的類型無關。 轉換需要reinterpret_cast,C樣式強制轉換或函數樣式強制轉換

有沒有一種方法可以將事件處理程序連接到非QObject類型? 一個最小的例子:

struct DataModel {
    void handle(double) { }
};

DataModel data;
QDoubleSpinBox spinBox;
connect(&spinBox, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
    &data, &DataModel::handle);

鑒於所有“連接”方法所做的只是設置事件轉發,因此這種類型的要求似乎是不必要的。 為什么不能在那里使用任何有效的函數指針?

從Qt 5開始可用的新連接選項之一是使用lambda作為插槽 ,在以下情況下非常有用:

// adapt the capture to your specific situation
connect(&spinBox, qOverload<double>(&QDoubleSpinBox::valueChanged),
       [&data](double arg) { data.handle(arg); });

PS:我使用了一種較短的形式來選擇正確的重載,您可能會發現它有用: qOverload<double>(...)

還有另一個連接模板重載,它可以接受任何類型的功能對象。 因此,我能夠將我的connect方法調用重寫為:

connect(&spinBox, QOverload<double>::of(&QDoubleSpinBox::valueChanged),
    std::bind(std::mem_fn(&DataModel::handle), &data, std::placeholders::_1);

然后,Qt不會嘗試將任何內容強制轉換為不兼容的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM