Qt Динамически создавать QWidget из QString

Я пытаюсь создать программу, которая читает информацию из базы данных и, соответственно, настроить макет. В частности, я хочу прочитать два поля даты и в зависимости от разницы между днями создать количество дней. Кто-нибудь получил представление о том, как это можно сделать? Я попытался создать элемент, используя свойство QString-> text (), но безуспешно по очевидным причинам, и мне удалось написать функцию для создания элемента, но моя проблема в том, что я не могу контролировать имя элемента, делая для меня с моими мусорными знаниями о c ++ невозможно взаимодействовать с данным элементом.

Спасибо за ваше время,

Приветствия.

1

Решение

Я думаю 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
}
3

Другие решения

Также вам может быть интересно, как создать объект по имени класса, используя QMetaType, Есть QMetaType::construct метод. Это требует, чтобы qRegisterMetaType Функция должна быть вызвана раньше. Подробное описание Вот.

1

По вопросам рекламы [email protected]