조성현

40000 Chip example implementation

#include "GraphicsView.h"
#include <qmath.h>
//View
View::View(const QString& name, QWidget *parent)
: QFrame(parent)
{
//GraphicsView settings
graphicsView = new GraphicsView(this);
graphicsView->setDragMode(QGraphicsView::RubberBandDrag);
graphicsView->setOptimizationFlags(QGraphicsView::DontSavePainterState);
graphicsView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
graphicsView->setTransformationAnchor(QGraphicsView::AnchorUnderMouse);
//connect
//layout
QGridLayout *topLayout = new QGridLayout;
topLayout->addWidget(graphicsView, 0, 0);
setLayout(topLayout);
setupMatrix();
}
QGraphicsView* View::view() const
{
return static_cast<QGraphicsView *>(graphicsView);
}
void View::setupMatrix()
{
qreal scale = qPow(qreal(2), qreal(2));
QMatrix matrix;
matrix.scale(scale, scale);
matrix.rotate(qreal(0));
graphicsView->setMatrix(matrix);
}
\ No newline at end of file
#ifndef GRAPHICSVIEW_H
#define GRAPHICSVIEW_H
#include <QFrame>
#include <QGraphicsView>
#include <QGridLayout>
//pre-declare
class View;
class GraphicsView
: public QGraphicsView
{
Q_OBJECT
private:
View* view;
public:
GraphicsView(View *v): QGraphicsView(), view(v) {};
};
class View
: public QFrame
{
Q_OBJECT
private:
GraphicsView *graphicsView;
public:
explicit View(const QString& name, QWidget *parent = 0);
QGraphicsView *view() const;
public slots:
/*void zoomIn(int level = 1);
void zoomOut(int level = 1);*/
void setupMatrix();
};
#endif // GRAPHICSVIEW_H
#include "NodeItem.h"
#include <QtWidgets>
void NodeItem::mousePressEvent(QGraphicsSceneMouseEvent * event)
{
}
void NodeItem::mouseMoveEvent(QGraphicsSceneMouseEvent * event)
{
}
void NodeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * event)
{
}
NodeItem::NodeItem(int x, int y)
{
this->x = x;
this->y = y;
this->color = QColor(0, 0, 0); //R, G, B
setZValue((x+y)%2);
setFlags(ItemIsSelectable | ItemIsMovable);
setAcceptHoverEvents(true);
}
QRectF NodeItem::boundingRect() const
{
return QRectF(0, 0, 110, 70);
}
QPainterPath NodeItem::shape() const
{
QPainterPath path;
path.addRect(14, 14, 82, 42);
return path;
}
void NodeItem::paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget)
{
Q_UNUSED(widget);
QColor fillColor = (option->state & QStyle::State_Selected) ? color.dark(150) : color;
if (option->state & QStyle::State_MouseOver)
fillColor = fillColor.light(125);
const qreal& lod = option->levelOfDetailFromTransform(painter->worldTransform());
if (lod < 0.2) {
if (lod < 0.125) {
painter->fillRect(QRectF(0, 0, 110, 70), fillColor);
return;
}
QBrush b = painter->brush();
painter->setBrush(fillColor);
painter->drawRect(13, 13, 97, 57);
painter->setBrush(b);
return;
}
QPen oldPen = painter->pen();
QPen pen = oldPen;
int width = 0;
if (option->state & QStyle::State_Selected)
width += 2;
pen.setWidth(width);
QBrush b = painter->brush();
painter->setBrush(QBrush(fillColor.dark(option->state & QStyle::State_Sunken ? 120 : 100)));
painter->drawRect(QRect(14, 14, 79, 39));
painter->setBrush(b);
if (lod >= 1) {
painter->setPen(QPen(Qt::gray, 1));
painter->drawLine(15, 54, 94, 54);
painter->drawLine(94, 53, 94, 15);
painter->setPen(QPen(Qt::black, 0));
}
// Draw text
//if (lod >= 2) {
// QFont font("Times", 10);
// font.setStyleStrategy(QFont::ForceOutline);
// painter->setFont(font);
// painter->save();
// painter->scale(0.1, 0.1);
// painter->drawText(170, 180, QString("Model: VSC-2000 (Very Small Chip) at %1x%2").arg(x).arg(y));
// painter->drawText(170, 200, QString("Serial number: DLWR-WEER-123L-ZZ33-SDSJ"));
// painter->drawText(170, 220, QString("Manufacturer: Chip Manufacturer"));
// painter->restore();
//}
// Draw lines
//QVarLengthArray<QLineF, 36> lines;
//if (lod >= 0.5) {
// for (int i = 0; i <= 10; i += (lod > 0.5 ? 1 : 2)) {
// lines.append(QLineF(18 + 7 * i, 13, 18 + 7 * i, 5));
// lines.append(QLineF(18 + 7 * i, 54, 18 + 7 * i, 62));
// }
// for (int i = 0; i <= 6; i += (lod > 0.5 ? 1 : 2)) {
// lines.append(QLineF(5, 18 + i * 5, 13, 18 + i * 5));
// lines.append(QLineF(94, 18 + i * 5, 102, 18 + i * 5));
// }
//}
//if (lod >= 0.4) {
// const QLineF lineData[] = {
// QLineF(25, 35, 35, 35),
// QLineF(35, 30, 35, 40),
// QLineF(35, 30, 45, 35),
// QLineF(35, 40, 45, 35),
// QLineF(45, 30, 45, 40),
// QLineF(45, 35, 55, 35)
// };
// lines.append(lineData, 6);
//}
//painter->drawLines(lines.data(), lines.size());
// Draw red ink
//if (stuff.size() > 1) {
// QPen p = painter->pen();
// painter->setPen(QPen(Qt::red, 1, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
// painter->setBrush(Qt::NoBrush);
// QPainterPath path;
// path.moveTo(stuff.first());
// for (int i = 1; i < stuff.size(); ++i)
// path.lineTo(stuff.at(i));
// painter->drawPath(path);
// painter->setPen(p);
//}
}
#ifndef NODEITEM_H
#define NODEITEM_H
#include <QColor>
#include <QGraphicsItem>
const int NODE_SIZE = 4;
class NodeItem
: public QGraphicsItem
{
private:
int x;
int y;
QColor color;
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override;
public:
NodeItem(int x, int y);
QRectF boundingRect() const override;
QPainterPath shape() const override;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
};
#endif // NODEITEM_H
\ No newline at end of file
......@@ -66,9 +66,13 @@
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<IncludePath>C:\boost\boost_1_63_0;$(IncludePath)</IncludePath>
<LibraryPath>C:\boost\boost_1_63_0\stage\lib;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<IncludePath>C:\boost\boost_1_63_0;$(IncludePath)</IncludePath>
<LibraryPath>C:\boost\boost_1_63_0\stage\lib;$(LibraryPath)</LibraryPath>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
......@@ -137,6 +141,10 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="GeneratedFiles\Debug\moc_GraphicsView.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_PaperGraphWidget.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
......@@ -151,11 +159,17 @@
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
</PrecompiledHeader>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_GraphicsView.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_PaperGraphWidget.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="GraphicsView.cpp" />
<ClCompile Include="main.cpp" />
<ClCompile Include="NodeItem.cpp" />
<ClCompile Include="PaperGraphWidget.cpp" />
</ItemGroup>
<ItemGroup>
......@@ -200,6 +214,25 @@
</ItemGroup>
<ItemGroup>
<ClInclude Include="GeneratedFiles\ui_PaperGraphWidget.h" />
<CustomBuild Include="GraphicsView.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing GraphicsView.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing GraphicsView.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing GraphicsView.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets"</Command>
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
<Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing GraphicsView.h...</Message>
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets"</Command>
</CustomBuild>
<ClInclude Include="NodeItem.h" />
</ItemGroup>
<ItemGroup>
<CustomBuild Include="PaperGraphWidget.qrc">
......
......@@ -50,6 +50,18 @@
<ClCompile Include="GeneratedFiles\qrc_PaperGraphWidget.cpp">
<Filter>Generated Files</Filter>
</ClCompile>
<ClCompile Include="NodeItem.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GraphicsView.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Debug\moc_GraphicsView.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="GeneratedFiles\Release\moc_GraphicsView.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="PaperGraphWidget.h">
......@@ -61,10 +73,16 @@
<CustomBuild Include="PaperGraphWidget.qrc">
<Filter>Resource Files</Filter>
</CustomBuild>
<CustomBuild Include="GraphicsView.h">
<Filter>Header Files</Filter>
</CustomBuild>
</ItemGroup>
<ItemGroup>
<ClInclude Include="GeneratedFiles\ui_PaperGraphWidget.h">
<Filter>Generated Files</Filter>
</ClInclude>
<ClInclude Include="NodeItem.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
</Project>
\ No newline at end of file
......
#include "PaperGraphWidget.h"
#include "NodeItem.h"
#include "GraphicsView.h"
PaperGraphWidget::PaperGraphWidget(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
initscene();
View *view = new View("temp view");
view->view()->setScene(scene);
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(view);
setLayout(layout);
setWindowTitle(tr("Paper Graph Visualization"));
}
PaperGraphWidget::~PaperGraphWidget()
void PaperGraphWidget::initscene()
{
scene = new QGraphicsScene(this);
int x = 0, y;
for (int i=-11000; i<11000; i+=110) {
++x;
y = 0;
for (int j=-7000; j<7000; j+=70) {
++y;
QGraphicsItem *item = new NodeItem(x, y);
item->setPos(QPointF(i, j));
scene->addItem(item);
}
}
}
......
......@@ -2,18 +2,23 @@
#define PAPERGRAPHWIDGET_H
#include <QtWidgets/QWidget>
#include <QGraphicsScene>
#include "ui_PaperGraphWidget.h"
//class QGraphicsScene;
class PaperGraphWidget : public QWidget
{
Q_OBJECT
public:
PaperGraphWidget(QWidget *parent = 0);
~PaperGraphWidget();
private:
void initscene();
Ui::PaperGraphWidgetClass ui;
QGraphicsScene *scene;
};
#endif // PAPERGRAPHWIDGET_H
......
<RCC>
<qresource prefix="PaperGraphWidget">
</qresource>
<qresource prefix="/PaperGraphWidget"/>
<qresource prefix="/GraphicsView"/>
<qresource prefix="/View"/>
</RCC>
......
......@@ -13,16 +13,6 @@
<property name="windowTitle">
<string>PaperGraphWidget</string>
</property>
<widget class="QGraphicsView" name="graphicsView">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>581</width>
<height>381</height>
</rect>
</property>
</widget>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>
......
......@@ -3,8 +3,11 @@
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QApplication app(argc, argv);
app.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings);
PaperGraphWidget w;
w.show();
return a.exec();
return app.exec();
}
......