Qt从QString动态创建QWidget

时间:2012-10-15 03:03:27

标签: c++ qt qwidget qstring

我正在尝试创建一个从数据库中读取信息的程序,并相应地设置布局。具体来说,我想读取两个日期字段,并根据日期之间的差异,创建一天的元素数量。谁有人知道如何做到这一点?我试图使用QString-> text()属性创建一个元素,但由于显而易见的原因没有成功,我设法编写了一个函数来创建一个元素,但我的问题是我无法控制元素的名称,用我对c ++的垃圾知识让我无法与给定元素进行交互。

感谢您的时间,

干杯。

2 个答案:

答案 0 :(得分:3)

我认为QHash将是满足您需求的完美工具。它允许通过唯一键存储和查找几乎任何东西。这意味着您可以将标题作为键存储在窗口小部件中,然后从该哈希中检索具有特定标题的窗口小部件。

以下是如何定义这样的哈希:

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

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

然后可以将Widgets(或任何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
}

答案 1 :(得分:1)

此外,它可能对您如何使用QMetaType按类名创建对象感兴趣。有QMetaType::construct方法。它要求之前应该调用qRegisterMetaType函数。 Detaild描述为here