crossplatform.ru

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


  Ответ в Qt Создание форм ошибка
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 26.2.2011, 7:05
 
Цитата(horror812 @ 25.2.2011, 22:36) *
А в этом ui_file.h - видно это class Ui_OxOutput
namespace UI ... class OxOutput: public Ui_OxOutput {};
приведи код этого файла.
horror812 Дата 25.2.2011, 20:36
  abc
Litkevich Yuriy


Спасибо.

Не много уточню, что бы разобраться
На примере моего класса class OxOutput : public QDockWidget {...}
А в этом ui_file.h - видно это class Ui_OxOutput
namespace UI ... class OxOutput: public Ui_OxOutput {};

Вот так если, я создаю мой new OxOutput (parent) в этом случае - удалиться
Как вы сказали родитель указан явно.
А в OxOutput этот экземпляр (UI::OxOutput *ui) и так удаляется через delete ui в деструкторе


А, что касается ДокВиджетов, если он отцеплен от формы он имеет родителя?
при закрытие он, вроде , просто скрывается, а удалять его нужно при закрытие формы?

Ну и вообще стоит ли "доверять" этому авто-удалению?)
или лучше, если форма не нужна ставить родитель в Ноль и удалять?

Litkevich Yuriy Дата 25.2.2011, 19:56
 
Цитата(horror812 @ 25.2.2011, 21:23) *
добавляю виджет через оператор new
правильно я понимаю, что при удаление родителя он его удалит?
нет, new здесь ничего не решает. Решает только иерархия объектов, если наследнику QObject устанавливается родитель, явно или не явно, то родитель удалит дитя, когда сам будет удалятся.
Примеры:
QWidget parent; // некий корневой объект
...
QWidget *o1 = new QWidget(parent);
...
QWidget *o2 = new QWidget();
o2->setParent(parent);
...

QLayout *l = new QLayout();
QWidget *w = new QWidget();
l->addWidget(w);

parent->setLayout(l);
Виджетам o1 и o2 родитель установлен явно.
А виджету w не явно, т.к. виджет помещён в компоновщик, а компоновщик установлен для виджета parent, тогда компоновщик сам устанавливает своим вложенным виджетам родителя, на который помещён сам компоновщик.

На основе этого (и внимательного изучения файлов ui_file.h) следует:
объект ui - не является наследником QObject и к нему не применим механизм автоудаления. Т.е. объект ui ты должен удалять руками в деструкторе класса, в котором ты создал этот объект.
abc Дата 25.2.2011, 19:53
  удалит
приведу пример, когда без нью неуютно. Допустим, у твоей программы есть "хелп" - нажал по кнопочке, окошко хелпа появляется, почитали хелп, забыли о нём. Допустим, что хелп сделан через QLabel. И вот у тебя слот кнопки:
on_pushButton_clicked()
{
QLabel label("помощь");
label.show();
}
При выходе из слота label удалится, и ты не увидишь хелпа. А если через нью, то label повисит, пока его сам не закроешь. Можно глобально переменную label выделить и держать её всё работу проги, а можно вот через нью локально.
Ну, вот такая, допустим, ситуация, думаю, она наглядна. Вроде бы не вру... Передаю слово Юре)
horror812 Дата 25.2.2011, 19:23
  Litkevich Yuriy Спасибо за помощь

В общем я разобрался, что-то было не так с файлом uic.exe (там где QT)
Я его заменил. И заработало)

Еще вопрос можно задать.
Если я добавляю виджет через оператор new
правильно я понимаю, что при удаление родителя он его удалит?
или мне нужно самому удалять в деструкторе?
или может стоит все нужное бросать на стек, а не через нью?
Спасибо.



horror812 Дата 25.2.2011, 18:08
 
Цитата(Litkevich Yuriy @ 25.2.2011, 17:42) *
В объявлении класса OxMainWindow, указатель ui объявлен так
Ui::OxMainWindow *ui;
?


да, так.

я код то и не писал.
Сделал все визардами, создал проект, создал свой виджет
и все, что сделал
подключил мой виджет
и объявил его в классе
остальной код был сгенерирован автоматом.

А есть ли в примерах, примеры (сорри за тавтологию) где используется редактор форм?
Нашел только такие, где редактор для основной формы, а все остальные кодом.
я бы в них поглядел)

Кстати говоря, если убрать мой виджет *.уи и поменять его на такой же
но созданный кодом (как в примерах - кодом)
все работает.
Но хочется QT Дизайнер использовать
Litkevich Yuriy Дата 25.2.2011, 17:42
  В объявлении класса OxMainWindow, указатель ui объявлен так
Ui::OxMainWindow *ui;
?
horror812 Дата 25.2.2011, 14:22
  Привет

Главная форма OxMainWindow.h
#include <QMainWindow>
//### Может инклуд не правильный пробовал и тот и тот (
//#include "oxoutput.h"
//#include "ui_oxoutput.h"

namespace Ui {class OxMainWindow;}

class OxMainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit OxMainWindow(QWidget *parent = 0);
    ~OxMainWindow();  
   OxOutput      *output; //###  HERE  ### Вот просто можно даже нигде не создавать output

OxMainWindow.cpp
Можно и ничего не менять и не создавать мой output
все как при генерации
#include "oxmainwindow.h"
#include "ui_oxmainwindow.h"
OxMainWindow::OxMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::OxMainWindow)
{
    ui->setupUi(this);
}
OxMainWindow::~OxMainWindow()
{
    delete ui;
}




Мой виджет oxoutput.h
#include <QDockWidget>
namespace Ui{  class OxOutput;}
class OxOutput : public QDockWidget
{
    Q_OBJECT
public:
    explicit OxOutput(const QString& title, QWidget *parent = 0);
    ~OxOutput();
private slots:
    void trace(const QString& str);
private:
    Ui::OxOutput *ui;
};


Мой виджет oxoutput.cpp
#include "oxoutput.h"
#include "ui_oxoutput.h"

OxOutput::OxOutput(const QString& title,QWidget *parent) :
    QDockWidget(title, parent),
    ui(new Ui::OxOutput)  
{
    ui->setupUi(this);
    this->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
}

OxOutput::~OxOutput()
{
    delete ui;
}

void OxOutput::trace(const QString& str)
{
   // ui->listOutput->addItem(str);
}





Спасибо за помощь)
Litkevich Yuriy Дата 25.2.2011, 7:00
 
Цитата(horror812 @ 25.2.2011, 0:20) *
Понял его так от берет мой файл и дописывает в него все эти компоненты во время компиляции.
Но его просмотр мне не помог)
приведи код здесь, чтобы сократить место, приводи объявления классов (заголовочники) и начало cpp-файлов (вместе с конструкторами)

По оформлению кода см. тему Справка по кнопкам и тэгам форума
horror812 Дата 24.2.2011, 22:20
 
Цитата(Litkevich Yuriy @ 24.2.2011, 21:43) *
Цитата(horror812 @ 24.2.2011, 23:28) *
-В конструкторе после ui->setupUI(this)
тебе нужно заглянуть в обработанный ui-файл, тогда поймёшь, что ты делаешь не так.
Если твой ui-файл называется myoutput.ui, то открой файл ui_myoutput.h (поищи в подкаталогх проекта).
внимательно его изучи



Спасибо за ответ.
не, я говорю можно даже не создавать экземпляр моего класса, а просто где-нибудь написать MyOutput ...
я так понимаю что файл ui_..
это просто описание формы кодом т.е.
условно говоря, я могу не в редакторе создавать, а написать все руками.
Понял его так от берет мой файл и дописывает в него все эти компоненты во время компиляции.
Но его просмотр мне не помог)
Я все же склоняюсь что я не так подключаю файл include '...myoutput'

Будь добр, посмотри пожалуйста
чтобы получит ошибку нужно от комментировать 2 строчки помеченные таким комментарием //###
в файле oxmainwindow.h

(4Кб) ifolder или slil.ru




Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 19:52