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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: собственный виджет  (Прочитано 3560 раз)
yuraborodin
Гость
« : Ноябрь 12, 2009, 03:24 »

Доброе утро, форум!
Странная проблема.
Написал свой виджет.
Вставил его при помощи дизайнера методом продвижения (promoted).
На форме разместил 2 таких виджета.
Но работает только один виджет. А второй нет. Долго не мог понять, в чем проблема.
Потом подумал, что виджет может быть уникальным только внутри одного родителя.
Тогда я их разместил в разных родителях-виджетах:первый виджет оставил как есть, а второй запихал в новый QWidget.И все работает. Вопрос - почему так? И как это решить правильно?
Спасибо.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Ноябрь 12, 2009, 03:31 »

всё дело в волшебных пузырьках.

Лучше код приложи, и опиши подробнее что за виджеты и что значит "не работает".
Записан
yuraborodin
Гость
« Ответ #2 : Ноябрь 12, 2009, 03:37 »

Виджет IplImageWidget для вывода изображения с картинки типа IplImage (из библиотеки OpenCV  (компьютерное зрение))
Код:
class IplImageWidget : public QWidget
{
    Q_OBJECT
public:
    IplImageWidget(QWidget* parent = 0, Qt::WFlags fl = 0 );
    ~IplImageWidget();
    void initWidget(CvCapture* video);
    void PutImage(IplImage* img);
protected:
    void paintEvent(QPaintEvent*);   
private:
    QImage qimage;
    QImage qimage1;
    IplImage* opencvimg;
    IplImage* opencvimg1;
};

IplImageWidget::IplImageWidget(QWidget* parent, Qt::WFlags fl)
: QWidget(parent, fl)
{}

IplImageWidget::~IplImageWidget()
{}

void IplImageWidget::initWidget(CvCapture* video)
{
    double h=cvGetCaptureProperty(video,CV_CAP_PROP_FRAME_HEIGHT);
    double w=cvGetCaptureProperty(video,CV_CAP_PROP_FRAME_WIDTH);
    qimage = QImage(QSize(w,h), QImage::Format_RGB888);
    qimage1 = QImage(QSize(w,h), QImage::Format_RGB888);
    opencvimg = cvCreateImageHeader(cvSize(qimage.width(),qimage.height()),8,3);
    opencvimg1 = cvCreateImageHeader(cvSize(qimage1.width(),qimage1.height()),8,1);
    opencvimg->imageData = (char*)qimage.bits();
    opencvimg1->imageData = (char*)qimage1.bits();
}

void IplImageWidget::PutImage(IplImage* img)
{
    if(img->nChannels==1)
    {
        cvCopy(img, opencvimg1, 0);
        cvCvtColor(opencvimg1,opencvimg,CV_GRAY2RGB);
    }
    else if(img->nChannels==3)
    {
        cvCopy(img, opencvimg, 0);
        cvCvtColor(opencvimg,opencvimg,CV_BGR2RGB);
    }
}

void IplImageWidget::paintEvent(QPaintEvent*)
{
    QPainter painter(this);   
    if(!qimage.isNull())
        painter.drawImage(QPoint(x(),y()), qimage.scaled(QSize(width(),height())));
}

и код ниже, который посылает картинку в виджет:

Код:
....
 ui->wFrames->initWidget(video);
....
    IplImage *originalImg=cvQueryFrame(video);   
    if(originalImg)
    {
        ui->wFrames->PutImage(originalImg);
    }
    .....
Вышеописанный код работает - картинка выводится.
Но если я вместо wFrames напишу wFrames2 - то картинка не будет выводиться.
Записан
yuraborodin
Гость
« Ответ #3 : Ноябрь 12, 2009, 15:46 »

попробовал по другому:
Код:
MainWindow::MainWindow(QWidget *parent): QWidget(parent)
{
   top = new IplImageWidget;
   bottom = new IplImageWidget;  
   play = new QPushButton("Play");        
   QVBoxLayout* vLayout = new QVBoxLayout;
   vLayout->addWidget(top);
   vLayout->addWidget(bottom);
   vLayout->addWidget(play);
   setLayout(vLayout);
   connect(play,SIGNAL(clicked()),this,SLOT(on_play_clicked()));
}

виджет bottom не оторбражается.

переделываю так:
 
Код:
top = new IplImageWidget;   
QWidget* parentWidget = new QWidget;
bottom = new IplImageWidget(parentWidget);  
play = new QPushButton("Play");
QVBoxLayout* vLayout = new QVBoxLayout;
vLayout->addWidget(top);
vLayout->addWidget(parentWidget);
vLayout->addWidget(play);
setLayout(vLayout);

тогда отображается.
Вопрос: почему я не могу располагать 2 виджета одинакового типа в одном родительском виджете???
Такое впечатление, что класс виджета IplImageWidget не дописан или неправильно определен.
Код:
class IplImageWidget : public QWidget
{
    Q_OBJECT
public:
    IplImageWidget(QWidget* parent = 0, Qt::WFlags fl = 0 );
    ~IplImageWidget();
    void initWidget(CvCapture* video);
    void PutImage(IplImage* img);
protected:
    void paintEvent(QPaintEvent*);   
private:
    QImage qimage;
    QImage qimage1;
    IplImage* opencvimg;
    IplImage* opencvimg1;
};
« Последнее редактирование: Ноябрь 12, 2009, 15:48 от yuraborodin » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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