我正在尝试构建一个内部带有图形场景的窗口:一堆彩色矩形(应该稍后移动)。
虽然我可以用
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>
这里,最丰富多彩的
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 ();
}
.