У меня был класс с множеством объектов-кнопок. Эти объекты создавались динамически, то есть:
h-файл:
QToolButton *bold;
QToolButton *italic;
QToolButton *underline;
c++ файл:
QToolButton *bold=new QToolButton(this);
bold->setObjectName("editor_tb_bold");
QToolButton *italic=new QToolButton(this);
italic->setObjectName("editor_tb_italic");
QToolButton *underline=new QToolButton(this);
underline->setObjectName("editor_tb_underline");
Мне все твердят, что так делать ненада, нужно просто сделать кнопки членами класса, а не указатели на них. Я так и сделал:
h-файл:
QToolButton bold;
QToolButton italic;
QToolButton underline;
c++ файл:
bold.setObjectName("editor_tb_bold");
italic.setObjectName("editor_tb_italic");
underline.setObjectName("editor_tb_underline");
Кнопки нужно в рантайме повтыкать на панель инструментов в последовательности, настроенной пользователем. (Точнее, вставлять нужно не только кнопки, но и например выпадающие списки). Вставка происходит по имени вставляемого объекта.
Ранее, когда были указатели, метод вставки в панель инструментов выглядел так:
void EditorToolBar::insertButtonToToolsLine(QString toolName, QToolBar *line)
{
if(toolName=="separator")
line->addSeparator();
else
{
QString name("editor_tb_"+toolName);
QWidget *tool=this->findChild<QWidget *>(name);
if(tool!=NULL)
{
tool->setVisible(true);
line->addWidget(tool); // Инструмент добавляется на панель инструментов
...
Теперь, когда членами класса являются не указатели на виджеты, а сами виджеты, я не могу понять, как воспользоваться методом findChild().
В документации на этот метод ничего не сказано о том, что он не может работать с обычными объектами, а не с указателями:
T QObject::findChild(const QString & name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
Returns the child of this object that can be cast into type T and that is called name, or 0 if there is no such object. Omitting the name argument causes all object names to be matched. The search is performed recursively, unless options specifies the option FindDirectChildrenOnly.
If there is more than one child matching the search, the most direct ancestor is returned. If there are several direct ancestors, it is undefined which one will be returned. In that case, findChildren() should be used.
Я пробовал получить указатель на член класса так:
QWidget *tool=this->findChild<QWidget *>(name);
QWidget *tool=&( qobject_cast<QWidget>( this->findChild<QWidget>(name) ) );
QWidget *tool=&( qobject_cast<QWidget>( &(this->findChild<QObject>(name)) ) );
QWidget *tool=qobject_cast<QWidget *>( &(this->findChild<QObject>(name)) );
Как я только не пробовал - ничего не получается.
Вопрос. Как заполучить указатель на член класса по QObject-имени объекта?