Russian Qt Forum
Ноябрь 23, 2024, 00:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Что такое ui в Qt Creator  (Прочитано 21026 раз)
lenny
Гость
« : Февраль 09, 2011, 16:11 »

Здравствуйте! Подскажите, что такое ui? Создаю форму и класс в Creator-е. Хочется иметь доступ к ui как к public. Даю доступ public, не работает, причем в creator-е в вываливающемся списке после ввода селектора класса ui все равно рисуется с замком, если закрыть проект и снова открыть ui без замка, но доступа нет. Делал метод возвращающий указатель, его успешно получаю, пользоваться не могу.

Код:
#include <QDialog>          //Это создает Creator
#include "ui_dialog.h"

namespace Ui {
    class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
public:
    Ui::Dialog *ui;
};

Хотелось бы иметь такую возможность Dialog d; d.ui->бла-бла-бла.
Код:
#include <dialog.h> 
MainWidget::MainWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MainWidget)
{
    ui->setupUi(this);
    Dialog *d = new Dialog(this);
    d->ui->pushButton->setText("------");          //Не работает, ругается
    d->open();
}

Пошел путем наследования
Код:
#include <QDialog>
#include "ui_dialog.h"
class Dialog : public QDialog, public Ui::Dialog
{
    Q_OBJECT

public:
    explicit
    Dialog(QWidget *parent = 0): QDialog(parent), Ui::Dialog()
    {
        setupUi(this);
    }
};

Работает! Но при изменении формы глючит, приходится пересобирать проект.
« Последнее редактирование: Февраль 09, 2011, 16:14 от lenny » Записан
Странник
Гость
« Ответ #1 : Февраль 09, 2011, 16:46 »

Борис, ты не прав! Требование инкапсуляции еще никто не отменял)
Записан
lenny
Гость
« Ответ #2 : Февраль 09, 2011, 16:58 »

Данный случай, правилам инкапсуляции С++ противоречит, или у меня пробелы в знаниях.
public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
    Ui::Dialog *ui;

А случай с наследованием показывает, что члены Ui::Dialog открыты.                             
« Последнее редактирование: Февраль 09, 2011, 17:09 от lenny » Записан
smackthat
Гость
« Ответ #3 : Февраль 12, 2011, 16:46 »

Создавай элементы gui вручную и меняй их как хочешь. На примере Paintings -> basic drawing можно посмотреть.
Записан
lenny
Гость
« Ответ #4 : Февраль 13, 2011, 12:38 »

Руками(кодом) начинал изучая qt, хочется более быстрой разработки с теми же возможностями. В принципе вариант с наследованием ui меня полностью устраивает. Странно что ui в виде объекта странно себя ведет. Подниму немного знания C++, может чего не понимаю.
« Последнее редактирование: Февраль 13, 2011, 12:40 от lenny » Записан
b-s-a
Гость
« Ответ #5 : Февраль 14, 2011, 23:24 »

ui - это лишь обертка для набора элементов, генерируемых на этапе компиляции из формы дизайнера. Использовать ее извне класса формы - моветон. Смотри, если сделать как ты хочешь, при изменении имени элемента в форме, после этого придется менять в 10 файлах. В одном же проще! Более того, посмотри как используется инкапсуляция в самой Qt. Ты где видел, чтобы у стандартного класса можно было получить доступ к ui?!? Нет такого. Вот и ты пиши. Придумай интерфейс (API) формы: что на входе, что на выходе. А все остальное инкапсулируй внутри класса формы.
Записан
lenny
Гость
« Ответ #6 : Февраль 15, 2011, 11:08 »

Спасибо! Действительно не красиво получается. На сам qt для мне весьма полезно посмотреть. А с объектом ui все в порядке, зря я на него нагнал, не знаю что там было, тот проект я удалил.
Записан
lenny
Гость
« Ответ #7 : Февраль 15, 2011, 12:49 »

ui - это лишь обертка для набора элементов, генерируемых на этапе компиляции из формы дизайнера.
Как-то не так я qt creator изучать стал, может delphi или .net подействовали. Вначале не мог найти файлы ui_....h подумал, что они не существуют или еще чего. Почитал теории, нашел ui_..h. Теперь все просто и понятно.
« Последнее редактирование: Февраль 15, 2011, 17:01 от lenny » Записан
lenny
Гость
« Ответ #8 : Февраль 17, 2011, 11:17 »

Здравствуйте! Возник глупый вопрос. Если у меня на форме имеется виджеты для которых необходимо использовать drag and drop, то следует их создавать вне дизайнера? Чтоб переопределить/определить функции dragEnterEvent и т.д. Или есть какой нибудь другой способ? Или сразу делать заготовку формы в дизайнере, брать файл ui_....h и забивать на дизайнер? Вроде можно и так и сяк. Какой подход лучше реализовывать?
« Последнее редактирование: Февраль 17, 2011, 14:10 от lenny » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Февраль 17, 2011, 11:49 »

использовать "promote to..." в дизайнере
Записан
lenny
Гость
« Ответ #10 : Февраль 17, 2011, 13:22 »

использовать "promote to..." в дизайнере
Не нашел "promote to..." у меня все на русском, а что это?
Записан
ruzik
Гость
« Ответ #11 : Февраль 17, 2011, 13:27 »

Преобразованные виджеты
Записан
lenny
Гость
« Ответ #12 : Февраль 17, 2011, 13:40 »

Поковырялся с преобразованием, ничего пока не получилось. Насколько понял, должен получится класс унаследованный от преобразованного виджета, записаться в отдельный файл, включиться в ui_...h, а потом в классе ui_тырыпыры создаться объекты этих классов. Вот тока файлов преобразованных я не нашел и creator тоже. Куда они выгружаются Непонимающий
Записан
lenny
Гость
« Ответ #13 : Февраль 17, 2011, 13:48 »

Поиск по диску ничего не дал Непонимающий, ну и фиг с ним. Руками не сложно написать.
Записан
b-s-a
Гость
« Ответ #14 : Февраль 17, 2011, 21:07 »

Ты видимо не очень понял, что такое "promote to"... Ты пишешь свой виджет, например, MySuperComboBox, наследник QComboBox. Чтобы не создавать его на форме ручками, ты кидаешь QComboBox, жмешь правой кнопкой мыши и выбираешь пункт "Преобразовать в". Затем в появившемся окне пишешь MySuperComboBox, выбираешь базовый виджет (в данном случае QComboBox), проверяешь название включаемого хидера, при необходимости включаешь галочку "глобальное включение" (это чтобы инклюды были с угловыми скобками, а не кавычками; в случае, если виджет находится в проекте, достаточно кавычек) и жмешь "добавить"...
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.