مشكلة كيو تي في تجاوز PaintEvent
-
22-07-2019 - |
سؤال
أقوم بتصنيف QProgressBar ضمن فئة فرعية في عنصر واجهة مستخدم مخصص، وقمت بالكتابة فوق PaintEvent الطريقة بالكود التالي :
void myProg::paintEvent(QPaintEvent *pe)
{
QProgressBar::paintEvent(pe);
QRect region = pe->rect();
QPainter *painter = new QPainter(this);
QPen *pen = new QPen;
painter->begin(this);
painter->setBrush(Qt::red);
int x = this->x();
int y = this->y();
pen->setWidth(10);
painter->setPen(*pen);
painter->drawLine(x,y,x+100,y);
painter->end();
}
أحاول عرض خط أحمر، كنقطة بداية، لأرى أنه يمكنني إضافة تعديلاتي الخاصة على الأداة.ومع ذلك، هذا لا يعمل.أرى الأداة فقط باعتبارها QProgressBar عادية.أي أفكار حول ما يمكن أن تكون خاطئة ؟
المحلول
وونظام الإحداثيات تحتاج إلى استخدام نسبة إلى الجزء العلوي الأيسر من القطعة، ولكن كنت على ما يبدو باستخدام بالنسبة إلى الأم الأداة. (القطعة من x و y احداثيات قريبة لآبائهم). لذلك الخط الخاص بك سوف يكون الحصول على قص.
وبالإضافة إلى ذلك، فإنه من الضروري استدعاء QPainter :: تبدأ وQPainter :: نهاية عند بنائها باستخدام QWidget * المعلمة. ورسام في التعليمات البرمجية لا يحصل حذف، إما. انها ليست ضرورية لخلق الرسام على كومة مع new
: أريد فقط إنشائه على المكدس
وجرب:
void myProg::paintEvent(QPaintEvent *pe) { QProgressBar::paintEvent(pe); QRect region = pe->rect(); QPainter painter(this); QPen pen(Qt::red); //Note: set line colour like this //(Brush line removed; not necessary when drawing a line) int x = 0; //Note changed int y = height() / 2; //Note changed pen.setWidth(10); painter.setPen(pen); painter.drawLine(x,y,x+100,y); }
وهذا يجب رسم خط أفقي أحمر 100 بكسل بدأت منذ فترة طويلة من منتصف اليسرى من القطعة.
نصائح أخرى
فقط بعض التعليقات على ما كتبت:
- الطريقة التي بنيت بها الرسام
QPainter(this)
يعني أنك لا تحتاج إلى الاتصال صراحةbegin()
وend()
, ، QT تعتني بذلك نيابةً عنك. - مع أخذ ذلك في الاعتبار، لن يتم استدعاء المدمر أبدًا، سيؤدي ذلك إلى تسرب مجموعة من الذاكرة بسبب كل ما هو جديد
QPainter
س. - أنا متأكد تمامًا
this->x()
وthis->y()
قم بإرجاع الزاوية العلوية اليسرى من النافذة، ولكن لا يزال يتعين عليك رؤية خط أحمر بعرض 5 بكسل في الجزء العلوي من النافذة.
عندما تقوم بتعيين QPainter
فرشاة، حاول استخدام QBrush
المنشئ بشكل صريح، كما فيpainter->setBrush( QBrush(Qt::red) );