الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة في Setpixel

بدأه ibr_exn في 9 ديسمبر 2009 · 8 رد · 1,438 مشاهدة · في قسم Cross Platform GUI Libraries العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سأزعجكم (وانشط القسم قليلا :wink: ) حيث اني احاول تطبيق بعض البرامج الخاصة بالرسم باستخدام الQT .

الكود التالي:

#include <QtCore/QCoreApplication>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <QImage>


// example page 95
inline int round (const float a) {return int (a + 0.5);}

void myline ( int x0, int y0, int xEnd, int yEnd){
     float dx= xEnd - x0, dy= yEnd-0, steps, k;
     float xInc, yInc,x=x0,y=y0;
     if (fabs(dx)>fabs(dy))
         steps = fabs(dx);
     else
         steps = fabs(dy);

     xInc = float(dx)/float(steps);
     yInc = float(dy)/float(steps);

  //   QImage::setPixel(round(x), round(y));
    setPixel(round(x), round(y));
    for (k=0; k<steps; k++){
          x+=xInc;
          y+=yInc;
          setpixel (round(x), round(y));
     }
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    myline(1,1,50,50);
    return a.exec();
}

يعطي رسائل الخطأ التاليه

main.cpp:5: QImage: No such file or directory
main.cpp:23: error: `setPixel' was not declared in this scope

معلش تحملوني شوي هاليومتين

:wub:

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#2

الخطأ أولا انك قمت بإستدعاء QImage وهي ضمن gui في مشروع console فأرسلو لك ان QImage غير متوفرة وعليك الذهاب الى ملف pro للبرنامج وحذف السطر QT-=gui

الفئة QCoreApplication تستعمل مع تطبيقات console غيرها الى #include <QtGui/QApplication>

ومشكلة setPixel انه تطلب نقطة ولون يكون unsigned int في حال استخدمت صييغة rgb32 ولاتنسى قوانين c++ :)

إليك الكود بعد التصحيح واتشرف بخدمتك .

#include <QtGui/QApplication>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <QImage>


// example page 95
inline int round (const float a) {return int (a + 0.5);}

void myline ( int x0, int y0, int xEnd, int yEnd){
    QImage im(QSize(100,100),QImage::Format_RGB32);//declare new image with size 100*100 and format  rgb32
    im.fill(0xffffff);
     float dx= xEnd - x0, dy= yEnd-0, steps, k;
     float xInc, yInc,x=x0,y=y0;
     if (fabs(dx)>fabs(dy))
         steps = fabs(dx);
     else
         steps = fabs(dy);

     xInc = float(dx)/float(steps);
     yInc = float(dy)/float(steps);

  //   QImage::setPixel(round(x), round(y));
    im.setPixel(round(x), round(y),0);//x,y,rgb by uint
    for (k=0; k<steps; k++){
          x+=xInc;
          y+=yInc;
         im.setPixel (round(x), round(y),0);//x,y,rgb by uint
     }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    myline(1,1,50,50);
    return a.exec();
}

تم تعديل هذه المشاركة بواسطة مصفوفة في 10 ديسمبر 2009 في 00:08

1

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#3

شكرا اخي مصفوفه. جاري التجربه

اقتباس
ولاتنسى قوانين c++

هذه هي المشكلة للاسف.

ملاحظه : الكود مأخوذ من الكتاب المشهور computer graphics with opengl

تم تعديل هذه المشاركة بواسطة ibr_exn في 10 ديسمبر 2009 في 00:13

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#4

نتائج التجربه:

عملت مشروع جديد GUI

استبدلت الكود الموجود في الملف main.cpp بالكود الموجود هنا . عملية الترجمة والتنفيذ لم تعطي رسائل خطأ.

لكن للاسف لا اتمكن من رؤية البرنامج التنفيذي. ما هي المشكله ؟

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#5

لرؤية الرسمة يجب ان تصنع نافذة تضع فيها الرسمة

في البداية اضف ملفات الترويسة التالية

#include <QLabel>
#include <QPixmap>

ثم أضف الكود التالي في آخر الدالة myline

QLabel* lab=new QLabel;//creat window for display pixmaps and text
    lab->setPixmap(QPixmap::fromImage(im));//convert image to pixmap
    lab->show();//show window

وتظهر لك الرسمة وهي خط قطري

linens.jpg

تم تعديل هذه المشاركة بواسطة مصفوفة في 10 ديسمبر 2009 في 00:35

2

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

#6

جزاك الله خيرا اخي.

تم التنفيذ و البرنامج يعمل بشكل سليم. :happy:

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#7

جميل ، لكن الخط غير مستقيم تماما ؟ هل المعادلة تعمل هكذا ؟

ويمكنك أن تجرب الرسم باستخدام الفئة QPainter حتى تستطيع أن تتحكم أكثر في خصائص ال Pen

    QPainter painter(&image);
    painter.fillRect(0,0,200,200,Qt::lightGray);
    painter.setRenderHint(QPainter::Antialiasing);

    QPen pen;
    pen.setBrush(Qt::blue);
    pen.setWidth(2);
    pen.setCapStyle(Qt::RoundCap);

    painter.setPen(pen);

    painter.drawPoint(round(x),round(y));


    for (k=0; k<steps; k++){
          x+=xInc;
          y+=yInc;

	  painter.drawPoint(round(x),round(y));
     }

post-60254-12604286461048_thumb.png

بالتوفيق.

1
#8

جميل ،

الكود تطبيق لاحدى خوارزميات رسم الخط المستقيم. ومثل ما ذكرت هو موجود في الكتاب اعلاه.

الحمد لله الذي هدانا لهذا وماكنا لنهتدي لولا ان هدانا الله

#9

طرق الرسم في qt عديدة ومختلفة

نقدر نستخدم الخوارزميات المرفقة مع QImage او QPainter او QGraphicsView اوQtOpenVG وهي شبيهة ل QPainter او QtOpenGL

وفي طرق إحتيالية شاهدتها في أحد الأمثلة المرفقة مع QtDemo قاموا بإستخدام الجداول QTableView في رسم الصور التي تعطيهم إياها بدون أن تشعر انها جدول (ولكن الفكرة هي انهم جعلوا كل خلية في الجدول عبارة عن بيكسل ) :blink:

وعلى قول أحد الدعايات Qt عام من خيالي :)

بسم الله الرحمن الرحيم

مدونة دوال

كيوتي العربي

مواضيع مشابهة