Russian Qt Forum

Qt => Qt-инструментарий => Тема начата: chem79 от Февраль 27, 2013, 16:37



Название: Программно добавить экземпляр виджета
Отправлено: chem79 от Февраль 27, 2013, 16:37
Я новичок в Qt и может ответ на мой вопрос очевиден, но я решения не нашел.
Создал собственный виджет для дизайнера с прикрученным к нему меню. По нажатию на один из пунктов меню надо на разрабатываемую форму положить экземпляр другого виджета. Т.е. получить результат аналогичный тому, как если бы разработчик просто перетащил мышкой из панели виджетов, чтобы была возможность отредактировать свойства. Подскажите куда смотреть в доках.


Название: Re: Программно добавить экземпляр виджета
Отправлено: gil9red от Февраль 27, 2013, 16:56
Так а в чем проблема?
Выделяете память под новый виджет, который хотите создать и указываете куда его разместить

Пример:

h:
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>

class MainWindow : public QWidget
{
    Q_OBJECT
   
public:
    MainWindow(QWidget *parent = 0);

private:
    int count;

public slots:
    void addButton();
};

#endif // MAINWINDOW_H

cpp:
Код:
#include "mainwindow.h"

/// PUBLIC
MainWindow::MainWindow(QWidget *parent):
    QWidget(parent),
    count(0)
{
    QPushButton *pButtonAddButton = new QPushButton("Click ME!!!");
    connect(pButtonAddButton, SIGNAL(clicked()),
            this, SLOT(addButton()));

    QVBoxLayout *vBoxLayoutMain = new QVBoxLayout();

    vBoxLayoutMain->addWidget(pButtonAddButton);

    setLayout(vBoxLayoutMain);
}

/// PUBLIC SLOTS
void MainWindow::addButton()
{
    count++;

    QPushButton *pButtonNew = new QPushButton(QString::number(count));
    connect(pButtonNew, SIGNAL(clicked()),
            this, SLOT(addButton()));

    this->layout()->addWidget(pButtonNew);
}


Название: Re: Программно добавить экземпляр виджета
Отправлено: chem79 от Март 01, 2013, 08:22
Так а в чем проблема?
Выделяете память под новый виджет, который хотите создать и указываете куда его разместить

Вероятно, я плохо сформулировал вопрос. То о чем Вы говорите подходит для runtime и это действительно просто. Я говорю о процессе разработки в дизайнере.
Если там сделать что-то подобное, то кнопка на форме появится, но в инспекторе объектов ее не будет и свойства соответственно отредактировать не удается.

Может так будет яснее:
(http://ib2.keep4u.ru/s/2013/03/01/71/71baaf6784f402e20de08c958d41eddc.jpg) (http://keep4u.ru/full/71baaf6784f402e20de08c958d41eddc.html)
(http://ib3.keep4u.ru/s/2013/03/01/72/725dbe195760780e7803f0efb76f04b7.jpg) (http://keep4u.ru/full/725dbe195760780e7803f0efb76f04b7.html)


Название: Re: Программно добавить экземпляр виджета
Отправлено: Bepec от Март 01, 2013, 08:37
Вы хотите свой виджет сделать? тогда ищите по словосочетания создание своего плагина для дизайнера/Qt Creator.


Название: Re: Программно добавить экземпляр виджета
Отправлено: chem79 от Март 01, 2013, 08:48
Собственно, я свой плагин УЖЕ сделал. Но как добавить в него указанный выше функционал? Мне найти в мануалах не удалось. :'(


Название: Re: Программно добавить экземпляр виджета
Отправлено: Bepec от Март 01, 2013, 09:07
Недостаточно информации для выдачи верного ответа.

Если его нет в диспетчере объектов, то значит вы либо сделали плагин неправильно, либо у вас плагин каким то макаром внедряется в уже существующий объект :D

Но тут смутно и больше походит на бред (мой).

PS больше информации, какой плагин для чего на чём основан, желателен код и прочая.


Название: Re: Программно добавить экземпляр виджета
Отправлено: chem79 от Март 01, 2013, 09:33
Собственно, функция вызывающаяся при нажатии на пункт меню.
(point - указатель на экземпляр вызвавший меню)

Код:
void SBranchPointMenu::addPoint()
{

    QPushButton *pButtonNew = new QPushButton("a!");
    QVBoxLayout *vBoxLayoutMain = new QVBoxLayout(qobject_cast<QWidget*>(point->parent()));
     vBoxLayoutMain->addWidget(pButtonNew);
}

При этом получается нередактируемая кнопка (см. скрины выше). А нужен полноценный вариант.