2012-10-15 44 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