ورود

View Full Version : سوال: مشکل در کار با QPainter \\ سازنده



mahak006
چهارشنبه 18 بهمن 1391, 14:01 عصر
من این کد رو می خوام اجرا کنم . یعنی یه QPainter جدید ایجاد کنم و QPainter دیگری رو بهش بدم . کد زیر کاری که می خوام رو می تونه از دید اول انجام بده .

out_painter=new QPainter(painter);

اما مشکل اینجاست که این خط error داره و دلیلش اینه که QPainter به صورت Private تعریف شده . حالا چجور ، کاری رو که میخوام ، انجام بدم . لطفا کمک کنید .

alamate_aoal
چهارشنبه 18 بهمن 1391, 20:02 عصر
مجاز به انجام اینکار نیستید. عبارت Q_DISABLE_COPY رو در Assistant جستجو کن , آنجا به تفصیل توضیح داده شده.


/*
Some classes do not permit copies to be made of an object. These
classes contains a private copy constructor and assignment
operator to disable copying (the compiler gives an error message).
*/
#define Q_DISABLE_COPY(Class) \
Class(const Class &) Q_DECL_EQ_DELETE;\
Class &operator=(const Class &) Q_DECL_EQ_DELETE;

//-------------

class Q_GUI_EXPORT QPainter
{
...
private:
Q_DISABLE_COPY(QPainter)
...
};

alamate_aoal
چهارشنبه 18 بهمن 1391, 20:04 عصر
دقیقا قصد انجام چه کاری رو دارید که نیاز به دو کپی از QPainter هست؟

mahak006
پنج شنبه 19 بهمن 1391, 02:18 صبح
دقیقا قصد انجام چه کاری رو دارید که نیاز به دو کپی از QPainter هست؟

می دونم نمی شه چنین کاری کرد . چون ارور هم همینو میگه . ببین من یه هدر فایل دارم که با QPainter داره چیزی می کشه و تابع استاتیک تعریف شده . حالا می خوام خروجی این تابع که گفتم رو تو چند فایل cpp مختلف استفاده کنم . در واقع از یک تابع که تو یه هدر فایل هست ، باید خروجی ( QPainter ) رو به چند فایل cpp بدم که اون ها هم QPainter مخصوص خودشون رو دارن .

alamate_aoal
پنج شنبه 19 بهمن 1391, 15:30 عصر
اما مشکل اینجاست که این خط error داره و دلیلش اینه که QPainter به صورت Private تعریف شده
دلیلش اینه که copy constructor و اپراتور تساوی private هستن نه خود QPainter .
اگر قرار بود QPainter خصوصی باشه اصولا نمی تونستید حتا از اون شیئی بسازید , اعمال شاقه پیشکش!

کدت رو نشون بده , کامپایل نمیشه هم ایراد نداره

mahak006
جمعه 20 بهمن 1391, 09:50 صبح
دلیلش اینه که copy constructor و اپراتور تساوی private هستن نه خود QPainter .
اگر قرار بود QPainter خصوصی باشه اصولا نمی تونستید حتا از اون شیئی بسازید , اعمال شاقه پیشکش!

کدت رو نشون بده , کامپایل نمیشه هم ایراد نداره

تو فایل .h این هست :

QPainter m_design:base(position2D point, QString text, double confidence)
{
QPainter *out_painter;
out_painter=new QPainter;
out_painter->setPen(QPen(Qt::yellow, 2));
out_painter->setBrush(QBrush(QColor(250, 231, 64, confidence*250+5)));
out_painter->drawText(point.x+12+300, point.y+300, text);
out_painter->drawEllipse(point.x+300-10, point.y+300-10, 10*2,10*2);
out_painter->setPen(QPen());
out_painter->setBrush(Qt::NoBrush);
return *out_painter;
}


تو .cpp میخوام اینو استفاده کنم :

QPainter painter=m_design::base(p,text,confidence);

alamate_aoal
جمعه 20 بهمن 1391, 19:19 عصر
QPainter *out_painter;
out_painter=new QPainter;
out_painter->drawText(point.x+12+300, point.y+300, text);

داری از QPainter بد استفاده میکنی. قبل از هر کاری باید مشخص کنی قصد نقاشی روی چه چیزی رو داری, کد بالا اینکار رو نمیکنه, دقیقا مثل اینه که داری روی هوا نقاشی میکنی:لبخند:.
برای مشخص کردن paint device میتونی از سازنده QPainter یا متد begin استفاده کنی:
QPainter *p = new QPainter;
p->begin(this);
p->drawLine(0, 0, width(), height());
p->end();

یه راه حل اینکه paint device رو به تابع base پاس کنی:
QPainter *painter= m_design::base(this,p,text,confidence);

QPainter m_design:base(QPaintDevice *dev,position2D point, QString text, double confidence)
{
QPainter *out_painter;
out_painter=new QPainter(dev);
out_painter->setPen(QPen(Qt::yellow, 2));
out_painter->setBrush(QBrush(QColor(250, 231, 64, confidence*250+5)));
out_painter->drawText(point.x+12+300, point.y+300, text);
out_painter->drawEllipse(point.x+300-10, point.y+300-10, 10*2,10*2);
out_painter->setPen(QPen());
out_painter->setBrush(Qt::NoBrush);
return *out_painter;
}

alamate_aoal
جمعه 20 بهمن 1391, 19:19 عصر
QPainter *drawer(QPaintDevice *dev)
{
QPainter *out_painter = new QPainter(dev);
out_painter->setRenderHint(QPainter::Antialiasing);
out_painter->setPen(Qt::red);
out_painter->drawLine(0, 0, dev->width(), dev->height());
return out_painter;
}

void MainWindow::paintEvent(QPaintEvent *e)
{
QMainWindow::paintEvent(e);

QPainter *p = drawer(this);
p->setPen(Qt::blue);
p->drawLine(0, height(), width(), 0);
delete p;
}

mahak006
جمعه 20 بهمن 1391, 22:12 عصر
QPainter *drawer(QPaintDevice *dev)
{
QPainter *out_painter = new QPainter(dev);
out_painter->setRenderHint(QPainter::Antialiasing);
out_painter->setPen(Qt::red);
out_painter->drawLine(0, 0, dev->width(), dev->height());
return out_painter;
}

void MainWindow::paintEvent(QPaintEvent *e)
{
QMainWindow::paintEvent(e);

QPainter *p = drawer(this);
p->setPen(Qt::blue);
p->drawLine(0, height(), width(), 0);
delete p;
}


شما درست می گین . البته من یه سری راه رو امتحان کردم و به جایی نرسیدم . خودم این راهو استفاده کردم که نتیجه داد :

class m_design
{
static QPixmap base(...);
};
QPixmap m_design:base(...)
{
QPixmap *pix;
QPainter *paint;
pix=new QPixmap(30,30);
paint=new QPainter(pix);
paint->setPen(...);
painter->drawLine();
...
return *pix;
}



...
Qpainter *painter;
QImage *img;
painter=new QPainter(img);
img=new ... ;
QPixmap *pixmap;
pixmap=m_design::base(...);
Painter->drawPixmap(x,y,pixmap);
...

شرمنده . کدا رو خاصه کردم تا راحت تر بشه فهمید . خواستم کل کد رو ننویسم . فقط جاهای مربوط به این جا رو بنویسم .