سؤال

أقوم بتصنيف 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 بكسل بدأت منذ فترة طويلة من منتصف اليسرى من القطعة.

نصائح أخرى

فقط بعض التعليقات على ما كتبت:

  1. الطريقة التي بنيت بها الرسام QPainter(this) يعني أنك لا تحتاج إلى الاتصال صراحة begin() و end(), ، QT تعتني بذلك نيابةً عنك.
  2. مع أخذ ذلك في الاعتبار، لن يتم استدعاء المدمر أبدًا، سيؤدي ذلك إلى تسرب مجموعة من الذاكرة بسبب كل ما هو جديد QPainterس.
  3. أنا متأكد تمامًا this->x() و this->y() قم بإرجاع الزاوية العلوية اليسرى من النافذة، ولكن لا يزال يتعين عليك رؤية خط أحمر بعرض 5 بكسل في الجزء العلوي من النافذة.

عندما تقوم بتعيين QPainterفرشاة، حاول استخدام QBrush المنشئ بشكل صريح، كما فيpainter->setBrush( QBrush(Qt::red) );

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top