Saya ingin melukis lingkaran dengan warna yang disediakan pengguna dan menyimpan penyesuaian edit garis di atasnya pada perataan horizontal.

Panggilan fungsi pelukis bekas pada slot, tetapi tidak berfungsi

#include <QPainter>
#include "cascadeColorHighlightWidget.h"

CascadeColorHighlightWidget::CascadeColorHighlightWidget(QWidget *parent) : QWidget(parent)
{
    setWindowFlags(Qt::FramelessWindowHint | Qt::Widget);
    setAttribute( Qt::WA_DeleteOnClose, true );
    setFixedSize(187,164);
    setContentsMargins(0,0,0,0);
}

void CascadeColorHighlightWidget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    QRectF contRect = contentsRect().adjusted(1, 1, -1, -1);
    painter.setPen(QPen(QColor(176, 176, 176),1));
    painter.setBrush(QColor(255,255,255));
    painter.drawRect(contRect);

    painter.setPen(QPen(QColor(51,51,51),1));
    QFont font( "Calibri" );
    font.setPixelSize(14);
    painter.setFont( font );

    painter.drawText(QPointF(contRect.x() + 18, contRect.y() + 28), "Color Highlight");
}

void CascadeColorHighlightWidget::focusOutEvent(QFocusEvent *event)
{
   Q_UNUSED(event);
   close();
}
void CascadeColorHighlightWidget::setColors(QColor color)
{
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    QRectF contRect = contentsRect().adjusted(1, 1, -1, -1);

    int rectYPos = contRect.y() + 55;

    painter.setPen(Qt::NoPen);
    QRectF ellipseRect = QRectF(contRect.x() + 18, rectYPos, 16, 16);

    painter.setPen(Qt::NoPen);
    painter.setBrush(color);
    painter.drawEllipse(ellipseRect);
    /*After this ellipse I need to draw a line edit where user can edit anytime*/

    }

Tetapi dengan memanggil setcolot itu tidak menggambar elips pada widget. Hanya item di paintEvent yang berfungsi.

Apakah mungkin dilakukan dengan pelukis atau saya perlu menyimpan widgetItems dan memasukkannya ke dalam wideget. tolong beri beberapa saran

1
Sijith 13 Desember 2017, 15:53

1 menjawab

Jawaban Terbaik

Semua pekerjaan pengecatan harus dilakukan dalam paintEvent. Anda harus menjaga status, dan mengecat item yang sesuai. Miliki metode yang menggunakan QPainter sebagai argumen dan panggil mereka dari dalam metode paintEvent, berikan objek QPainter yang Anda buat di sana.

Contoh:

Di tajuk widget Anda memiliki:

private:
    void setColors(QColor c) { color = c; }
    void drawEllipse(QPainter & painter);
    QColor color;
    bool draw_ellipse;

Seperti yang Anda lihat, metode setColors hanya menetapkan warna dan Anda menyimpan warna itu dalam variabel instans pribadi color.

Metode baru menghosting pekerjaan pengecatan (sebelumnya di setColors):

void CascadeColorHighlightWidget::drawEllipse(QPainter &painter)
{
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    QRectF contRect = contentsRect().adjusted(1, 1, -1, -1);

    int rectYPos = contRect.y() + 55;

    painter.setPen(Qt::NoPen);
    QRectF ellipseRect = QRectF(contRect.x() + 18, rectYPos, 16, 16);

    painter.setPen(Qt::NoPen);
    painter.setBrush(color);
    painter.drawEllipse(ellipseRect);
    /*After this ellipse I need to draw a line edit where user can edit anytime*/
}

Variabel color di baris ini

painter.setBrush(color);

Adalah yang Anda atur menggunakan metode setColors.

Metode paintEvent harus seperti:

void CascadeColorHighlightWidget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    QRectF contRect = contentsRect().adjusted(1, 1, -1, -1);
    painter.setPen(QPen(QColor(176, 176, 176),1));
    painter.setBrush(QColor(255,255,255));
    painter.drawRect(contRect);

    painter.setPen(QPen(QColor(51,51,51),1));
    QFont font( "Calibri" );
    font.setPixelSize(14);
    painter.setFont( font );

    painter.drawText(QPointF(contRect.x() + 18, contRect.y() + 28), "Color Highlight");

    if(draw_ellipse)
    {
        drawEllipse(painter);
    }
}

Pada akhirnya, Anda menguji draw_ellipse (jangan lupa menginisialisasi ke false di konstruktor) dan memanggil metode drawEllipse jika true.

Mari kita menggambar elips, misalnya menggunakan QWidget mousePressEvent:

void CascadeColorHighlightWidget::mousePressEvent(QMouseEvent *event)
{
    setColors(QColor(Qt::red));
    draw_ellipse = true;
    update();
}

Di sini, Anda mengatur warna, pertama, lalu set draw_ellipse ke true, lalu (dan itu sangat penting) Anda memanggil perbarui slot dari QWidget:

[...] menjadwalkan acara cat untuk diproses ketika Qt kembali ke loop acara utama.

Jadi metode paintEvent akan dipanggil, dan lukisan Anda diperbarui sesuai dengan status kelas Anda (variabel color dan draw_ellipse).

0
p-a-o-l-o 13 Desember 2017, 16:55