Цитата(++Norton++ @ 7.3.2009, 11:02)
И всетаки, как же строить графики?
Сегодня вечером. Впринципе, уже практически все есть. Вечером покажу!
Вот сделал масштабирование. И нажатие на некоторые кнопки:
+ - масштаб +
- - масштаб -
ALT+X - выход
ALT+Enter - показ на весь экран (и обратно).
class QPaintEvent;
class QPainter;
class QRubberBand;
class QKeyEvent;
class QResizeEvent;
class QCloseEvent;
class QShowEvent;
class QWheelEvent;
class QMouseEvent;
/// Виджет, где будет отрисовываться график
class GraphicWidget: public QWidget, public Ui::GraphicWidgetClass
{
Q_OBJECT
private:
PlotSettings settings; ///< настройка для различных масштабов
QRubberBand* rubber; ///< "резиновая лента"
bool rubberBandIsShown; ///< флажок попадания курсора в "резиновую ленту"
QPoint origin; ///< начальные координаты выделяемой области
private:
void drawGrid(QPainter *painter);
protected:
void paintEvent(QPaintEvent* events);
void keyPressEvent(QKeyEvent* events);
void wheelEvent(QWheelEvent* events);
void mousePressEvent(QMouseEvent* events);
void mouseMoveEvent(QMouseEvent* events);
void mouseReleaseEvent(QMouseEvent* events);
void resizeEvent(QResizeEvent* events) { QWidget::resizeEvent(events); update(); }
void closeEvent(QCloseEvent* events) { QWidget::closeEvent(events); }
void showEvent(QShowEvent* events) { QWidget::showEvent(events); }
public:
GraphicWidget(QWidget *parent = 0, Qt::WFlags flags = 0);
~GraphicWidget();
void setPlotSettings(const PlotSettings& sts) { settings = sts; settings.adjust(); update(); }
void zoom(double delta) { settings.scale(delta, delta); settings.adjust(); update(); }
};
#include <QRubberBand>
#include <QKeyEvent>
#include <QWheelEvent>
#include <QMouseEvent>
/// Отрисовка графика
void GraphicWidget::paintEvent(QPaintEvent* events)
{
QPainter painter(this);
drawGrid(&painter);
QWidget::paintEvent(events);
}
/// Нажатие на кнопки клавиатуры
void GraphicWidget::keyPressEvent(QKeyEvent* events)
{
switch(events -> key())
{
case Qt::Key_Plus:
zoom(-1.0);
break;
case Qt::Key_Minus:
zoom(1.0);
break;
case Qt::Key_Left:
settings.scroll(-1.0, 0.0);
update();
break;
case Qt::Key_Right:
settings.scroll(1.0, 0.0);
update();
break;
case Qt::Key_Up:
settings.scroll(0.0, 1.0);
update();
break;
case Qt::Key_Down:
settings.scroll(0.0, -1.0);
update();
break;
case Qt::Key_X:
if(events -> modifiers() & Qt::ALT) close();
break;
case Qt::Key_Return:
if(events -> modifiers() & Qt::ALT)
{
if(!isMaximized()) showMaximized();
else showNormal();
}
break;
default:
QWidget::keyPressEvent(events);
}
}
/// Изменение масштаба при движении колесика
void GraphicWidget::wheelEvent(QWheelEvent* events)
{
int numDegrees = events -> delta() / 8;
double numTicks = numDegrees / 15.0;
zoom(numTicks);
update();
}
/// Нажатие на кнопку - изменение масштаба
void GraphicWidget::mousePressEvent(QMouseEvent* events)
{
QWidget::mousePressEvent(events);
QRect r;
switch(events -> button())
{
case Qt::LeftButton: ///< если нажата левая кнопка мыши
origin = events -> pos();
rubberBandIsShown = true;
setCursor(Qt::CrossCursor);
r = QRect(origin, QSize());
rubber -> setGeometry(r);
rubber -> show();
break;
case Qt::RightButton: ///< если нажата правая кнопка мыши
break;
default:
break;
}
}
/// Переопределение функции передвижения мыши
void GraphicWidget::mouseMoveEvent(QMouseEvent* events)
{
if(rubberBandIsShown)
{
rubber -> setWindowOpacity(0.0);
rubber -> setGeometry(QRect(origin, events -> pos()).normalized());
}
update();
}
/// Возвращение прежнего вида курсору и изменение масштаба
void GraphicWidget::mouseReleaseEvent(QMouseEvent* events)
{
if(events -> button() == Qt::LeftButton && rubberBandIsShown)
{
rubberBandIsShown = false;
unsetCursor();
QRect rect = rubber -> geometry().normalized();
if(rect.width() < 10 || rect.height() < 10)
{
double dx = rect.width() / settings.spanX();
double dy = rect.height() / settings.spanY();
settings.scroll(dx, dy);
update();
return;
}
PlotSettings prevSettings = settings;
double dx = prevSettings.spanX() / width();
double dy = prevSettings.spanY() / height();
settings.minX = prevSettings.minX + dx * rect.left();
settings.maxX = prevSettings.minX + dx * rect.right();
settings.minY = prevSettings.maxY - dy * rect.bottom();
settings.maxY = prevSettings.maxY - dy * rect.top();
settings.adjust();
rubber -> hide();
update();
}
}
Сообщение отредактировал AD - 7.3.2009, 14:53