Qt-Paint系统

Qt里面,要想画图,只有把画图的过程放入paintEvent()方法中,每次窗口变化时会回调paintEvent() 方法

Paint events are sent to widgets that need to update themselves, for
instance when part of a widget is exposed because a covering widget was
moved.

QPainter

The QPainter class performs low-level painting on widgets and other paint devices.

QPainter 类对象作用于继承QPaintDevice 类的对象

QPaintDevice

QPainter对象可以在QPaintDevice上进行绘画操作

常用的QPaintDevice 子类有QWidget, QPixmap, QImage

示例

//画图并保存为图片
void SomeWidget::painterEvent()
{
    QImage image(
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的Qt示例代码,用于模拟Simulink嵌套子系统的功能。代码实现了一个加法器和一个乘法器,这两个组件可以嵌套在一个自定义QWidget中,实现嵌套子系统的功能。 main.cpp: ```cpp #include <QApplication> #include "mysystem.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); // 创建一个自定义QWidget,用于表示嵌套子系统的外部框架 MySystem system; system.show(); return a.exec(); } ``` mysystem.h: ```cpp #ifndef MYSYSTEM_H #define MYSYSTEM_H #include <QWidget> #include <QGraphicsScene> class MySystem : public QWidget { Q_OBJECT public: explicit MySystem(QWidget *parent = 0); private: QGraphicsScene *scene; }; #endif // MYSYSTEM_H ``` mysystem.cpp: ```cpp #include "mysystem.h" #include "myitem.h" MySystem::MySystem(QWidget *parent) : QWidget(parent) { // 创建一个QGraphicsScene,用于显示和编辑组件 scene = new QGraphicsScene(this); // 创建一个加法器 MyItem *adder = new MyItem("+", QColor(Qt::red), this); adder->setPos(50, 50); scene->addItem(adder); // 创建一个乘法器 MyItem *multiplier = new MyItem("*", QColor(Qt::blue), this); multiplier->setPos(150, 150); scene->addItem(multiplier); // 将加法器嵌套到乘法器中 multiplier->addItem(adder); // 设置场景大小 scene->setSceneRect(0, 0, 300, 300); // 将场景添加到QWidget中 QGraphicsView *view = new QGraphicsView(scene, this); view->setRenderHint(QPainter::Antialiasing); view->setDragMode(QGraphicsView::RubberBandDrag); view->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate); view->setRenderHint(QPainter::SmoothPixmapTransform); view->setMinimumSize(300, 300); } ``` myitem.h: ```cpp #ifndef MYITEM_H #define MYITEM_H #include <QGraphicsItem> #include <QList> class MyItem : public QGraphicsItem { public: MyItem(QString text, QColor color, QGraphicsItem *parent = 0); void addItem(MyItem *item); QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void mousePressEvent(QGraphicsSceneMouseEvent *event); void mouseMoveEvent(QGraphicsSceneMouseEvent *event); void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); private: QString text; QColor color; QList<MyItem *> childItems; }; #endif // MYITEM_H ``` myitem.cpp: ```cpp #include "myitem.h" #include <QPainter> #include <QStyleOptionGraphicsItem> #include <QGraphicsSceneMouseEvent> MyItem::MyItem(QString text, QColor color, QGraphicsItem *parent) : QGraphicsItem(parent) { this->text = text; this->color = color; } void MyItem::addItem(MyItem *item) { childItems.append(item); } QRectF MyItem::boundingRect() const { return QRectF(0, 0, 100, 50); } void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { Q_UNUSED(option); Q_UNUSED(widget); // 绘制组件的外框 painter->setPen(QPen(Qt::black, 1)); painter->setBrush(QBrush(color)); painter->drawRect(0, 0, 100, 50); // 绘制组件的文本 painter->setPen(QPen(Qt::black, 1)); painter->setFont(QFont("Arial", 12)); painter->drawText(QRectF(0, 0, 100, 50), Qt::AlignCenter, text); } void MyItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { // 记录鼠标按下的位置 startPos = event->pos(); } void MyItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { // 移动组件 QPointF delta = event->pos() - startPos; moveBy(delta.x(), delta.y()); } void MyItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { // 连接组件 QList<QGraphicsItem *> items = scene()->items(event->scenePos()); foreach (QGraphicsItem *item, items) { MyItem *myItem = dynamic_cast<MyItem *>(item); if (myItem && myItem != this) { myItem->addItem(this); } } } ``` 这段代码实现了一个非常简单的嵌套子系统,仅供参考。如果需要实现更复杂的功能,需要根据具体情况进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值