QColor::fromHsv 对于不同的值大多返回黑色,否则返回灰色

问题描述 投票:0回答:1

我正在尝试构建一个内部带有图形场景的窗口:一堆彩色矩形(应该稍后移动)。

虽然我可以用

Qt::green
e 为我的矩形着色。 g。 (也显示在
scheibe.cpp:3
中,我没有设法用自定义
QColor
对它们进行着色。只有灰度值似乎符合
QColor
的期望。有什么建议吗?

我的代码

// main.cpp
#include <QApplication>
#include "fensterHaupt.h"

int main (int argc, char *argv []) {
    QApplication app (argc, argv);
    FensterHaupt fh (18, &app);
    fh.show ();
    return app.exec ();
}
// fensterHaupt.h
#ifndef FENSTERHAUPT_H
#define FENSTERHAUPT_H

#include <QStyleOptionGraphicsItem>
#include <QLayout>
#include <QList>
#include <QMainWindow>
#include <QPainter>
#include <QRectF>
#include <QWidget>
#include "scheibe.h"
#include "ui_fensterHaupt.h"

class FensterHaupt : public QMainWindow {
    Q_OBJECT

public :
    FensterHaupt (int scheibenzahl, QApplication *vorfahr = 0);
    Ui::FensterHaupt uiFensterHaupt;
    QVBoxLayout *layout;
    QGraphicsScene* szenenbild = new QGraphicsScene (this);
    int scheibenzahl = 18;
    QList <QColor> farbpalette;
    QColor farbeFestlegen (int scheibennr);
    void spielfeldFullen ();
};

#endif // FENSTERHAUPT_H
// fensterHaupt.cpp
#include "fensterHaupt.h"
#include "ui_fensterHaupt.h"

FensterHaupt::FensterHaupt (int sz, QApplication *vorfahr) : scheibenzahl (sz) {
    uiFensterHaupt.setupUi (this);
    for (int h = 0; h <= 359; h += 60) {
        farbpalette.append (QColor::fromHsv (h, 0, 0) );
    }
    farbpalette.append (QColor (QColor::fromHsv (30, 0, 0) ) );
    spielfeldFullen ();
}

QColor FensterHaupt::farbeFestlegen (int scheibennr) {
    return farbpalette.at (scheibennr);
}

void FensterHaupt::spielfeldFullen () {
    for (int s = 0; s < scheibenzahl; s ++) {
        Scheibe* S = new Scheibe (s, farbeFestlegen (s), 20 * s, szenenbild);
        QWidget *widget = new QWidget;
        szenenbild->addItem (S);
        S->paint (new QPainter, new QStyleOptionGraphicsItem, nullptr);
    }
    uiFensterHaupt.spielfeld->setScene (szenenbild);
}
// scheibe.h
#ifndef SCHEIBE_H
#define SCHEIBE_H

#include <QColor>
#include <QGraphicsItem>
#include <QPainter>

class Scheibe : public QGraphicsItem {
public :
    Scheibe (int scheibennr, QColor scheibenfarbe, int y, QGraphicsScene *vorfahr);
    QRectF boundingRect () const;
    void paint (QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr);
    int scheibennr = 0, x, y, breite = 120;
    const int hohe = 20;
    QColor farbe;
    QRectF scheibenbild;
    QGraphicsScene* szenenbild;
};

#endif // SCHEIBE_H
// scheibe.cpp
#include "scheibe.h"

const std::vector <QColor> farben = {(Qt::red), (Qt::magenta), (Qt::yellow), (Qt::green), (Qt::blue), (Qt::cyan), (Qt::gray), (Qt::black)};

Scheibe::Scheibe (int snr, QColor scheibenfarbe, int positionY, QGraphicsScene *vorfahr) : scheibennr (snr), farbe (scheibenfarbe), y (positionY), szenenbild (vorfahr) {
    QRectF sb (20, y, 60, 20);
    scheibenbild = sb;
}

QRectF Scheibe::boundingRect () const {
    return scheibenbild;
}

void Scheibe::paint (QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
    Q_UNUSED (option);
    Q_UNUSED (widget);
    painter->setBrush (farben [scheibennr]); // taking colours here works properly
    painter->setBrush (farbe); // taking colours here doesn't work (properly)
    painter->drawRect (boundingRect () );
}
// fensterHaupt.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>FensterHaupt</class>
 <widget class="QMainWindow" name="FensterHaupt">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>480</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="rahmenAuen">
   <widget class="QGraphicsView" name="spielfeld">
    <property name="geometry">
     <rect>
      <x>0</x>
      <y>0</y>
      <width>790</width>
      <height>420</height>
     </rect>
    </property>
    <property name="minimumSize">
     <size>
      <width>20</width>
      <height>20</height>
     </size>
    </property>
    <property name="sizeAdjustPolicy">
     <enum>QAbstractScrollArea::AdjustToContents</enum>
    </property>
    <property name="alignment">
     <set>Qt::AlignBottom|Qt::AlignHCenter</set>
    </property>
   </widget>
  </widget>
 </widget>
 <resources/>
 <connections/>
</ui>
c++ qt colors qcolor
1个回答
0
投票

这里,最丰富多彩的

QColor
从255开始,而不是0。因此,代码是

// constructor
FensterHaupt::FensterHaupt (int sz, QApplication *vorfahr) : scheibenzahl (sz) {
    uiFensterHaupt.setupUi (this);
    for (int h = 0; h <= 359; h += 60) {
    farbpalette.append (QColor::fromHsv (h, 255, 255) );
    }
    farbpalette.append (QColor (QColor::fromHsv (30, 255, 255) ) );
    spielfeldFullen ();
}

solution

.

© www.soinside.com 2019 - 2024. All rights reserved.