2016-01-28 118 views
0

我知道應該避免投射,我正在嘗試這樣做,但我不能看到如何使用QToolBox進行投射。如何避免使用QToolBox投射?

我建築的窗戶有一個QToolBox供用戶選擇他想要做的操作,並且在工具箱內部是每個操作的具體參數。 「應用」按鈕位於QToolBox之外。

當用戶點擊應用按鈕時,我必須得到他所選擇的操作及其參數。

問題是,QToolBox currentWidget()方法返回一個QWidget,它是一個我不能改變的類。所以我不能使用虛擬方法或類似的東西。我看到獲取參數的唯一方法是使用投射。

下面是一些代碼來顯示我的問題:

class BaseOperation : QWidget { 
    public: 
    virtual int getParameter() = 0; 
} 

class Operation1 : public BaseOperation { 
... 
} 

class Operation2 : public BaseOperation { 
... 
} 
... 
_ui->toolBox->addItem(new Operation1(this), "OP 1"); 
_ui->toolBox->addItem(new Operation2(this), "OP 2"); 
... 
QWidget* curItem = _ui->toolBox->currentWidget(); 

BaseOperation* op = dynamic_cast<BaseOperation*>(op); 

op.getParameter(); 

有沒有更好的辦法做到我想要什麼?我想過使用工具箱中的項目索引和哈希映射來做到這一點,但這看起來不太符合OOP。

+1

你做什麼沒有問題。更重要的是:既然你靜態地知道'curItem'是一個'BaseOperation',那麼這個cast應該是'static_cast'。 – peppe

回答

-1

您可以跟蹤widget changes,地圖索引Operation類混凝土(不使用HashMap的,但簡單的switch-case),然後static_cast<>它,但是這就是動態轉換爲你做,基本上是這樣。

在這種情況下,使用動態轉換完全可以。

-2

是完全可以避免蒙上了可能的不同的方法是使用setProperty("name", QVariant(value))你需要在部件中的數據相關聯,然後使用property("name").toInt()當前控件取回數據 - 這避免了石膏,如果你需要什麼定義單獨的類是一個整數值(或其他合理簡單的值)

+0

...然後仍然*鑄造*'property'返回的'QVariant'。考慮到'QToolBox'的目的是爲了訪問其內容? – peppe

+0

...如果所需的值是int或其他簡單的值,則不需要轉換... – MiMo