crossplatform.ru

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

4 страниц V  < 1 2 3 4 >  
Ответить в данную темуНачать новую тему
> Помогите разобраться с отрисовкой виджета
XpycT
  опции профиля:
сообщение 21.7.2009, 20:40
Сообщение #11


Студент
*

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

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




Репутация:   0  


Благодаря вашей помощи появился мой первый виджет, собственно скрин в первом посте. Реализована загрузка рисунков через QFileDialog, очистка, drag-and-drop локальных и удаленных(скачиваются в временную директорию) рисунков и запоминание пути к нему.
Делал для формы заливки на сайт - может кому и пригодится. Правда хотелось бы сделать правное "выезжание" панельки, но к сожалению в Qt еще не силен :)

Собственно сам виджет : Прикрепленный файл  imagewidget.zip ( 5.79 килобайт ) Кол-во скачиваний: 194


ЗЫ Хотел сделать плагин для дизайнера, откомпилил нормально... но при клике в панели виджетов вываливается крит. ошибка и приглашение в отладчик :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 21.7.2009, 21:05
Сообщение #12


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


Молодец что доделал :)

Виджет твой скачал, посмотрел. Только он не комплится в таком виде, пришлось комментарии кое где убрать :)

Если хочешь, могу очень нудно и досконально откомментировать, т.к. есть очень много мест, над которыми нужно работать :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
XpycT
  опции профиля:
сообщение 21.7.2009, 21:21
Сообщение #13


Студент
*

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

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




Репутация:   0  


Цитата(ufna @ 21.7.2009, 21:05) Link
Молодец что доделал :)

Виджет твой скачал, посмотрел. Только он не комплится в таком виде, пришлось комментарии кое где убрать :)

Если хочешь, могу очень нудно и досконально откомментировать, т.к. есть очень много мест, над которыми нужно работать :)


Я только за, ведь как еще научиться, если не на своих ошибках :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 21.7.2009, 22:44
Сообщение #14


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


1. оформление кода. Представь, что у тебя будет не один такой файлик, а десятки, многие из которых в кучу раз длиннее. Как ты в нем ориентироваться будешь?
2. комментирование кода. Название функций, что делают, и т.д. и т.п.

Т.е. код должен быть хорошо оформлен, более читабелен. Это приходит с опытом и по началу кажется излишним, но - лучше начни уделять этому внимание сейчас, потом будет куда легче.

3. Не стоит формировать виджет в main функции. Пусть это будет отдельный класс. В мейне - просто создаем что надо и делаем основную настройку приложения.

4. Сам класс. Если ты делаешь виджет, который в принципе может использоваться не в одном экземпляре и даже других проектах - он должен быть "вещью в себе", но не более чем. Грубо говоря, цель его - показывать картинку с рамочкой. А значит, он должен уметь:
  • Принимать в себя картинку из внешнего пространства
  • Отображать ее
  • Удалять ее из себя
  • Посылать сигналы: картинка добавлена, картинка удалена, и - очень важно - сигнал-запрос на добавление картинки.


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

Т.е. грубо говоря, нужно подходить к виджету как к немного другому функционалу, чтобы он не был "все умею, все могу". Он не должен уметь работать с сетью, зачем? А если я два десяткс таких поставлю на форму?

Я говорю именно о таких вот, виджетах специализированного использование, но которые не должны делать больше, чем.

А - так - молодец :) Работай дальше, изучай программирование и Qt, и опыт появится. Главное, самое главное - хорошо оформляй код. Делай его читаемым и структурированым. Это позволит видеть свои ошибки в дальнейшем куда быстрее :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
XpycT
  опции профиля:
сообщение 22.7.2009, 8:48
Сообщение #15


Студент
*

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

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




Репутация:   0  


Комментариев не хватает,согласен, просто надо привыкнуть всегда их ставить :)
На счет сигналов/слотов и ... если я тебя правильно понял, то допустим для открытия рисунка через диалог лучше в mousePressEvent просто вызвать сигнал, допустим emit imageOpen(const QString &imageName)?

Хотел еще спросить на счет drag-and-drop'a .Почему, когда я использую в dragEnterEvent
if(event->mimeData()->hasImage())

ну или на худой конец
if (event->mimeData()->hasFormat("image/jpeg") && ...)

он игнорирует рисунки. Ну или как можно ограничить рисунками, чтобы другие типы файлов были запрещены(курсор перечеркнутой мыши)? Просто у меня идет проверка только после "скидывания" файла, и то по расширению. :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 22.7.2009, 9:06
Сообщение #16


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


по сигналам - не совсем. Откуда у тебя взялось имя файла? При нажатии на кнопку ты получаешь желание его добавить изображение, т.е. можно выслать emit( imageDemand() ). А вот когда ты на виджет перетащил файл мышью из системы, то вот тогда - добавляешь на виджет, и - посылаешь emit( imageAdded(QString) ). Или можно слать указатель на картинку и т.п. :)


А про дрэг н дроп - в dragEnterEvent сделай вывод qDebug() << event->mimeData()->formats() :) Там увидишь какие форматы и что шлет тебе систем. Я на память не помню. Так когда из системы перетаскиваешь, будет не картика, а путь к ней, если не ошибаюсь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
XpycT
  опции профиля:
сообщение 22.7.2009, 15:19
Сообщение #17


Студент
*

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

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




Репутация:   0  


Что-то у меня со слотами не получается :( в виджете на клик по рисунку "открыть" поставил emit imageBrowse();. в форме приложения прикрутил сигнал, но после выбора рисунок не открывается и путь к нему пустой :( Хотя если диалог открытия в самом виджете - все работает. Делал так :
testApp.h
#ifndef TESTAPP_H
#define TESTAPP_H

#include <QDialog>
#include "ImageWidget.h"
class TestApp : public QDialog
{
    Q_OBJECT

public:
    TestApp(QWidget *parent=0);
private slots:
    void openImage();
private:
    ImageWidget screen1;
    ImageWidget screen2;
};

#endif // TESTAPP_H

testApp.cpp
#include <QtGui>
#include "testapp.h"
#include "ImageWidget.h"

TestApp::TestApp(QWidget *parent)
        :QDialog(parent)
{
    ImageWidget *screen1=new ImageWidget;    
    ImageWidget *screen2=new ImageWidget;  
    screen2->loadImage("D:\\21.jpg"); // <<< Если на прямую с конструктора - все работает прекрасно.
    QHBoxLayout *layout =new QHBoxLayout;
    layout->addWidget(screen1);
    layout->addWidget(screen2);
    setLayout(layout);

    connect(screen1,SIGNAL(imageBrowse()),this,SLOT(openImage()));

}
void TestApp::openImage()
{    
    QString fileName = QFileDialog::getOpenFileName(this,tr("Select Image"),
                                       QApplication::applicationDirPath(),
                                       tr("Image Files (*.jpg *.jpeg *.png *.bmp *.gif)"));

          if(fileName.isEmpty())
            return;
          else
              screen1.loadImage(fileName);
}


Подскажите где я ошибся :mellow:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 22.7.2009, 15:30
Сообщение #18


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


при чем тут слоты?
ты посмотри что написал то?

...
private:
    ImageWidget screen1;
    ImageWidget screen2;
...

а в конструкторе
...
ImageWidget *screen1=new ImageWidget;    
    ImageWidget *screen2=new ImageWidget;  
....


П.С.
самая распространенная ошибка, если не ошибаюсь, людей только что представленных С++. :)

Сообщение отредактировал kwisp - 22.7.2009, 15:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 22.7.2009, 15:32
Сообщение #19


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


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

Т.е. посмотри на мессадж выше и кое-что подправь.

Сообщение отредактировал ufna - 22.7.2009, 15:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 22.7.2009, 15:51
Сообщение #20


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


Цитата(ufna @ 22.7.2009, 16:32) Link
Слот у тебя приватный, а присоединяешь его к сигналу, поступаемому от чужого класса, никак не связанного с данным. Сделай слот public.

категорически не согласен
сигналы вообще protected и нормально коннектятся.
пример с приватным слотом
Раскрывающийся текст
#ifndef _R_
#define _R_

#include <QObject>
#include <QtDebug>
#include <QtGlobal>

class Sender: public QObject
{
    Q_OBJECT
public:
        Sender(QObject* par=0):QObject(par){ startTimer(1000);}
signals:
        void sg();
protected:
    void timerEvent(QTimerEvent*)
    {
        emit sg();
    }
};

class Rec: public QObject
{
    Q_OBJECT
public:
        Rec(QObject* par=0):QObject(par)
        {
            
            sender__ = new Sender;
            connect(sender__,SIGNAL(sg()),this,SLOT(sl()));
        }
private slots:
    void sl(){ qDebug()<<__func__;}

private:
    Sender* sender__;
};

#endif //_R_


думается что спецификатор доступа влияет на вызов только при обращении на прямую не через соединение
может ошибаюсь, поправьте.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 24.12.2025, 15:38