crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

История благодарностей участнику FantasyOr ::: Спасибо сказали: 4 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
16.12.2012, 17:25 Открытие одной формы по клику из другой
зачем человека плохому учите... при подходе "сохранять указатель..." будет правильно работать если форма 2 вызывается только из формы 1, в случае же если это форма истории, то обычно она открывается из как минимум 2х мест: из формы списка сущностей и из формы просмотра-редактирования сущности. Тогда открыв форму истории из списка и попутно попытаетесь открыть из формы редактирования, у вас получится 2 формы истории причём запросто 2х разных сущностей.
Тут может быть 2 решения:
1) Сделать форму синглтоном (пишу с телефона не очень удобно код писать, но там не много переделывать )
2) в конструкторе формы истории добавить в свойства приложения свойство существования формы истории: qApp.setProperty("formHistory", true), в деструкторе устанавливать это свойство в false, а методах открытия истории проверяешь свойство, и если false создаёшь форму.
Но лучше сделать через синглтон-одиночка общепринятый паттерн, профит получишь, в резюме сможешь добавить "применяю паттерны программирования...".

чтоб нормально кампилилось и не нужно было в каждый проект таскать библиотеки, создай переменную среды path и qtdir для чего они и что должны содержать ищи а асистенте.
#include "history.h" - не угловые скобки, а кавычки


hst->show(); - бкдет не достаточно, если форма открыта, но находится за другой формой будет пичалька, поэтому форме истории нужно делать ещё и rise() - рассвет, выводит форму на первый план, возможно написал с ошибкой посмотри в асистенте как правильно писать.

*недостаточно
lex_qt,
18.5.2011, 10:21 Проход xml
у Вас должно получиттся:
#define NodeName "scene"


irReleaseXML::traverseNode1(const QDomNode &node, QString bufLevel)
{
    QDomElement child = node.firstChildElement(NodeName);
    while (!child.isNull())
    {
        QString bufScene = child.attribute("id");
        QString str = "XMLrelease/"+bufLevel+"/";

        QDir a;
        a.mkdir(str);

        QDomDocument docXML;
        QDomElement b = docXML.createElement("");

        docXML.appendChild(b);

        QFile file(str+bufScene+".xml");

        if(file.open(QIODevice::WriteOnly))
        {
            QTextStream out(&file);
            out << docXML.toString() << endl;
            file.close();
        }

        child = child.nextSiblingElement(NodeName);
    }
}
epishev,
17.5.2011, 15:32 Проход xml
делаю вот так:
#define NodeName "NodeName"
...
...
QDomElement root = DomDocument.documentElement();

QDomElement child = root.firstChildElement(NodeName);
while (!child.isNull())
{
  // действия с child

        child = child.nextSiblingElement(NodeName);
}


тут я прохожу по всем нодам с определенным именем в Вашем случае "scene".


могу ошибаться, но
domNode = domNode.nextSibling();

нужно ставить не в if, а за ним, ибо тогда есть вероятность, что
if(domNode.isElement())

будет false и курсор не сдвинется на след нод => domNode не изменится.
epishev,
17.12.2010, 17:48 создание виджетов в ходе работы программы
для eldar85


myPage::myPage()
{
pushButton = new QPushButton;
textEdit = new QTextEdit;
groupBox = new QGroupBox;
layoutV = new QVBoxLayout;
layoutV->addWidget(textEdit);
layoutV->addWidget(pushButton);
groupBox->setLayout(layoutV);
}

не забудь давать перентов элементам через new:

myPage::myPage()
{
pushButton = new QPushButton(this);
textEdit = new QTextEdit(this);
groupBox = new QGroupBox(this);
layoutV = new QVBoxLayout(this);
layoutV->addWidget(textEdit);
layoutV->addWidget(pushButton);
groupBox->setLayout(layoutV);
}

чтоб память руками не чистить в деструкторе, а то если и в деструкторе забудешь, то твоя прога будет беспощадно жрать память у очень общительных людей =)

Алексей1153 дело говорит:

myPage::myPage() унаследуй от QWidget, а не закладку добавляй свой класс.
Динамически это самое интересное
пример класса, который добавляется динамически:
class TAdditionalRouteWidget : public QWidget
{
    Q_OBJECT
public:
    TAdditionalRouteWidget(QWidget *parent = 0);
    ~TAdditionalRouteWidget();
             ...
             ...
signals:
    void deleteClick();
    void switchClick();
    void changedRoute();
private:
    QHBoxLayout *FLayout;
    QTextEdit *teAdditionalRoutes;
    QPushButton *btnDelRoute;
    QPushButton *btnSwitchRoute;
private slots:
    void slt_deleteClick();
    void slt_switchClick();
    void slt_changedRoute();
};


TAdditionalRouteWidget::TAdditionalRouteWidget(QWidget *parent)
    : QWidget(parent)
{
    FLayout = new QHBoxLayout(this);
    FLayout->setContentsMargins(0, 0, 0, 0);

    teAdditionalRoutes = new QTextEdit(this);

    btnDelRoute = new QPushButton(this);
    btnDelRoute->setStatusTip(tr("Удалить маршрут"));
    btnDelRoute->setIcon(QIcon(":/Resources/Recycle.png"));
    btnDelRoute->setIconSize(QSize(32, 32));

    btnSwitchRoute = new QPushButton(this);
    btnSwitchRoute->setStatusTip(tr("Сделать главным"));
    btnSwitchRoute->setIcon(QIcon(":/Resources/Switch.png"));
    btnSwitchRoute->setIconSize(QSize(32, 32));

    FLayout->addWidget(teAdditionalRoutes);
    FLayout->addWidget(btnSwitchRoute);
    FLayout->addWidget(btnDelRoute);
    FLayout->addStretch();

    teAdditionalRoutes->setFixedHeight(50);

    QObject::connect(btnDelRoute, SIGNAL(clicked()), this, SLOT(slt_deleteClick()));
    QObject::connect(btnSwitchRoute, SIGNAL(clicked()), this, SLOT(slt_switchClick()));
    QObject::connect(teAdditionalRoutes, SIGNAL(textChanged()), this, SLOT(slt_changedRoute()));

    setLayout(FLayout);
}


Пример динамического добавления и удаления класса:
процедура добавления нового виджета маршрута
{
    TAdditionalRouteWidget *ar = new TAdditionalRouteWidget(this);
    FRoutesLayout->insertWidget(FAdditionalRoutes.size(), ar);
    FAdditionalRoutes.push_back(ar);

    QObject::connect(ar, SIGNAL(deleteClick()), this, SLOT(slt_DelRoute()));
    QObject::connect(ar, SIGNAL(switchClick()), this, SLOT(slt_SwitchRoute()));
    QObject::connect(ar, SIGNAL(changedRoute()), this, SLOT(slt_ChangedRoute()));
}

процедура удаления виджета
slt_DelRoute()
{
    TAdditionalRouteWidget *ar = dynamic_cast<TAdditionalRouteWidget *>(sender());
    int idx = FAdditionalRoutes.indexOf(ar);
    if (idx != -1)
    {
        ar = FAdditionalRoutes.takeAt(idx);
        FRoutesLayout->removeWidget(ar);
        delete ar;
    }
}





в общем случае примерно так. Может топорно? профи критикуйте пожалуйста
eldar85,

RSS Текстовая версия Сейчас: 15.7.2020, 21:26