Как нарисовать линии, способные изменить цвет в Qt? - PullRequest
1 голос
/ 02 декабря 2019

меня беспокоит вопрос, может быть, это простой вопрос для вас, ребята. я хочу рисовать буксировочные линии в моем виджете Qt, когда QComboBox cbx установлен на элементе 1, первая строка установлена ​​на красный, вторая черная, наоборот, 2, первая чёрная, вторая красная. я использовал *paintEvent*, чтобы нарисовать свои линии. (на самом деле, если вы хотите что-то нарисовать, вы должны нарисовать в paintEvent функцию) Но я не знаю, как изменить цвет линии на основе элемента QComboBox, ниже приведены мои коды.

#include "changecolor.h"  
#include "ui_changecolor.h"  
QString st;  
QPainter painter;  

ChangeColor::ChangeColor(QWidget *parent) :  
    QMainWindow(parent),  
    ui(new Ui::ChangeColor)  
{  
    ui->setupUi(this);  
    setFixedSize(2000, 1000);  
    QComboBox * cbx = new QComboBox(this);  
    cbx->setSizeAdjustPolicy(QComboBox::AdjustToContents);  
    cbx->addItem("1", Qt::DisplayRole);  
    cbx->addItem("2", Qt::DisplayRole);  
    st = cbx->currentText();  
    connect(cbx, SIGNAL(currentTextChanged(QString)), this, SIGNAL(changeColorSlot(st, painter)));  
}  

void ChangeColor::paintEvent(QPaintEvent*)  
{  
//    QPainter painter(this);  
//    painter.setPen(Qt::black);  
//    painter.drawLine(QPoint(100,100), QPoint(1100,100));  
//    painter.drawLine(QPoint(100,100), QPoint(100,600));  
//    changeColorSlot(painter, );  
    changeColorSlot(st, painter);  
}  

void ChangeColor::changeColorSlot(QString& st, QPainter& painter)  
{  
//    QPainter painter(this);  
    if(st == tr("1"))  
    {  
        painter.setPen(Qt::black);  
        painter.drawLine(QPoint(100,100),QPoint(1100,100));  
        painter.setPen(Qt::red);  
        painter.drawLine(QPoint(100,100),QPoint(100,600));  
    }  
    else if(st == tr("2"))  
    {  
        painter.setPen(Qt::red);  
        painter.drawLine(QPoint(100,100),QPoint(1100,100));  
        painter.setPen(Qt::black);  
        painter.drawLine(QPoint(100,100),QPoint(100,600));  
    }  
    update();  

}  

ChangeColor::~ChangeColor()  
{  
    delete ui;  
}  

эти коды обозначают мою болезненную жизнь, я имею в виду, что я пробовал много раз, но нет правильного результата. спасибо, ребята.

Ответы [ 2 ]

0 голосов
/ 02 декабря 2019

Вы должны установить логику, управляющую состоянием (цветом линий) вне виджета:

вот пример с соответствующими частями

.h: #include

namespace Ui
{
    class ChangeColor;
}

class ChangeColor : public QWidget
{
    Q_OBJECT

    public:
        explicit ChangeColor(QWidget *parent = nullptr);
        void paintEvent(QPaintEvent* pe);
        ~ChangeColor();

    public slots:
        void setColorState(int state);

    private:
        Ui::ChangeColor* ui{nullptr};
        int state{};
};

.cpp
...
void ChangeColor::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)
    QPainter paint(this);

    QColor RED_COLOR{255, 0, 0};
    QColor BLACK_COLOR{0, 0, 0};
    if(state == 0)
    {
        paint.setPen(QPen(RED_COLOR));
        paint.setBrush(RED_COLOR);
    }
    else
    {
        paint.setPen(QPen(BLACK_COLOR));
        paint.setBrush(BLACK_COLOR);
    }
    paint.drawLine(0, 0, width(), height());
}

void ChangeColor::setColorState(int state)
{
    this->state = state;
    update();
}
0 голосов
/ 02 декабря 2019

Я полагаю, вы ищете эту функцию:

QComboBox* cb = ...;
QAbstractItemView* view = cb->view();
view->setAlternatingRowColors(true);
...