Qt 动态创建 QWidget from QString.



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

谢谢你的时间,

干杯。

我认为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
}

此外,您可能对如何使用 QMetaType 按类名创建对象感兴趣。有QMetaType::construct方法。它要求在之前调用qRegisterMetaType函数。详细描述在这里。

最新更新