2012-10-15 43 views
1

我想創建一個從數據庫中讀取信息並相應地設置佈局的程序。具體而言,我想閱讀兩個日期字段,並根據日子之間的差異,創建一天(s)數量的元素。有沒有人知道如何做到這一點?我試圖創建一個使用QString-> text()屬性的元素,因爲顯而易見的原因沒有成功,我設法編寫了一個函數來創建一個元素,但是我的問題是我無法控制元素的名稱,使得對我來說,我無法瞭解有關C++的垃圾知識,然後與給定的元素進行交互。Qt從QString動態創建QWidget

謝謝你的時間,

乾杯。

回答

3

我認爲QHash將是您需要的完美工具。它允許通過唯一鍵存儲和查找幾乎任何東西。這意味着您可以將它們的標題作爲關鍵字存儲,然後稍後使用該哈希中的特定標題檢索小部件。

下面是如何定義這樣的散列:

// .h file 
#include <QtCore/QHash> 
#include <QtGui/QWidget> 

class MyWidget : public QWidget 
{ 
    // ... 
private: 
    QHash< QString, QWidget* > m_dynamicWidgetHash; 
}; 

小部件(或任何QWidget的子類)可以然後被存儲在這樣的散列,假設標題總是唯一

// .cpp file 
void MyWidget::someMethod() 
{ 
    QList<QString> widgetTitles = getWidgetTitlesFromSomewhere(); 

    foreach(QString title, widgetTitles) 
    { 
     SomeWidgetSubclass* widget = new SomeWidgetSubclass(this); 
     widget->setTitle(title); 
     // Note: This will not work if two widgets can have the same title 
     Q_ASSERT(!m_dynamicWidgetHash.contains(title)); 
     m_dynamicWidgetHash.insert(title, widget); 
    } 
} 

您可以稍後再找到你的部件只知道像這樣的名字:

// .cpp file 
void MyWidget::someOtherMethod(const QString& title) 
{ 
    SomeWidgetSubclass* widget = m_dynamicWidgetHash.value(title); 
    if(!widget) 
    { 
     // TODO: Error Handling 
     return; 
    } 

    // Do whatever you want with the widget here 
} 
+0

+1對於QHash ...我怎麼才知道它? – UmNyobe

+0

Qt有很多很不錯的東西隱藏在它的文檔中;-)如果你是新手,我推薦閱讀[容器類](http://qt-project.org/doc/qt-4.8/containers.html)。 –

+0

@Tim Meyer太棒了!謝謝! –

1

此外,它可能會對您感興趣如何使用QMetaType按類名創建對象。有QMetaType::construct方法。它要求qRegisterMetaType函數應該在之前被調用。詳細說明是here