crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Qt Создание форм ошибка, ошибка в простом проекте
horror812
  опции профиля:
сообщение 24.2.2011, 21:28
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 24.2.2011
Пользователь №: 2443

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем привет!

Я немножко новичок в QT)
Мои действия
-создаю проект в QT Creator (Компилятор МинГВ)
-добавляю к нему еще форму (это 3 файла *.ui,*.h,*.cpp), а точнее Виджет (QDockWidget) называю его MyOutput
-В Основной форме (MyMainWindow) добавляю указатель на этот виджет
MyOutput *output;
-В конструкторе после ui->setupUI(this)
его создаю output = new MyOutput(tr('...'), this);
После компиляции
возникает ошибка (отправить отчет в виндоус)

В принципе даже если не создавать new MyOutput
а просто оставить MyOutput *output; в Классе
эта ошибка есть...

предполагаю, что я не правильно подключаю (include)
я подключаю #include "widgets\myoutput.h"
а ведь QT генерирует еще файлы ui_myout...h

ПС Пути не содержат пробелов, и кириллицы
Спасибо!





Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 24.2.2011, 21:43
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 24.2.2011
Пользователь №: 2443

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(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




Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.2.2011, 7:00
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

По оформлению кода см. тему Справка по кнопкам и тэгам форума
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
horror812
  опции профиля:
сообщение 25.2.2011, 14:22
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 24.2.2011
Пользователь №: 2443

Спасибо сказали: 0 раз(а)




Репутация:   0  


Привет

Главная форма 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, 17:42
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


В объявлении класса OxMainWindow, указатель ui объявлен так
Ui::OxMainWindow *ui;
?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
horror812
  опции профиля:
сообщение 25.2.2011, 18:08
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 24.2.2011
Пользователь №: 2443

Спасибо сказали: 0 раз(а)




Репутация:   0  


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


да, так.

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

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

Кстати говоря, если убрать мой виджет *.уи и поменять его на такой же
но созданный кодом (как в примерах - кодом)
все работает.
Но хочется QT Дизайнер использовать
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
horror812
  опции профиля:
сообщение 25.2.2011, 19:23
Сообщение #8


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 24.2.2011
Пользователь №: 2443

Спасибо сказали: 0 раз(а)




Репутация:   0  


Litkevich Yuriy Спасибо за помощь

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

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



Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
abc
  опции профиля:
сообщение 25.2.2011, 19:53
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 221
Регистрация: 16.12.2010
Из: СПб
Пользователь №: 2272

Спасибо сказали: 26 раз(а)




Репутация:   4  


удалит
приведу пример, когда без нью неуютно. Допустим, у твоей программы есть "хелп" - нажал по кнопочке, окошко хелпа появляется, почитали хелп, забыли о нём. Допустим, что хелп сделан через QLabel. И вот у тебя слот кнопки:
on_pushButton_clicked()
{
QLabel label("помощь");
label.show();
}
При выходе из слота label удалится, и ты не увидишь хелпа. А если через нью, то label повисит, пока его сам не закроешь. Можно глобально переменную label выделить и держать её всё работу проги, а можно вот через нью локально.
Ну, вот такая, допустим, ситуация, думаю, она наглядна. Вроде бы не вру... Передаю слово Юре)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 25.2.2011, 19:56
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(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 ты должен удалять руками в деструкторе класса, в котором ты создал этот объект.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 18:32