QT 常用窗口api

常用窗口api

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <QLabel>
#include <QGridLayout>

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = nullptr);
    ~Dialog();


private:
    QGridLayout *layout;
    QLabel *label1;
    QLabel *label1_1;

    QLabel *label2;
    QLabel *label2_1;

    QLabel *label3;
    QLabel *label3_1;

    QLabel *label4;
    QLabel *label4_1;


    QLabel *label5;
    QLabel *label5_1;

    //窗口大小变化事件
    void resizeEvent(QResizeEvent *event) override;

    //窗口移动事件
    void moveEvent(QMoveEvent *event) override;

public:
    //更新标签内容
    void updateLabel();
};
#endif // DIALOG_H

#include "dialog.h"

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    this->setWindowTitle("窗体常用api");
    this->resize(300,200);
    layout=new QGridLayout(this);

    label1=new QLabel("geometry:");
    label1_1=new QLabel();

    label2=new QLabel("width:");
    label2_1=new QLabel();


    label3=new QLabel("height:");
    label3_1=new QLabel();

    label4=new QLabel("rect:");
    label4_1=new QLabel();

    label5=new QLabel("size:");
    label5_1=new QLabel();


    layout->addWidget(label1,0,0);
    layout->addWidget(label1_1,0,1);
    layout->addWidget(label2,1,0);
    layout->addWidget(label2_1,1,1);
    layout->addWidget(label3,2,0);
    layout->addWidget(label3_1,2,1);
    layout->addWidget(label4,3,0);
    layout->addWidget(label4_1,3,1);
    layout->addWidget(label5,4,0);
    layout->addWidget(label5_1,4,1);


    updateLabel();
}

//窗口大小变化事件
void Dialog::resizeEvent(QResizeEvent *event) {
    updateLabel();
}

//窗口移动事件
void Dialog::moveEvent(QMoveEvent *event){
    updateLabel();
}

void Dialog::updateLabel(){
    QString str;
    QString str1;
    QString str2;
    QString str3;
    QString str4;
    str1.setNum(this->geometry().x());//它描述了窗口部件在屏幕上的实际矩形区域。
    str2.setNum(this->geometry().y());
    str3.setNum(this->geometry().width());
    str4.setNum(this->geometry().height());
    str=str1+" "+str2+" "+str3+" "+str4;
    label1_1->setText(str);



    QString strw,strh;


    label2_1->setText(strw.setNum(this->width()));
    label3_1->setText(strh.setNum(this->height()));



    QString  strrect;
    //rect函数返回的是窗口的位置和大小 它描述了窗口部件客户区的矩形区域。
    strrect.setNum(this->rect().x());
    strrect.append(" ");
    strrect.append(strw.setNum(this->rect().y()));
    strrect.append(" ");
    strrect.append(strw.setNum(this->rect().width()));
    strrect.append(" ");
    strrect.append(strh.setNum(this->rect().height()));

    label4_1->setText(strrect);

    QString strsize;
    strsize.setNum(this->size().width());
    strsize.append(" ");
    strsize.append(strh.setNum(this->size().height()));
    label5_1->setText(strsize);

}


Dialog::~Dialog() {}

绘图框架设计 Qpainter

/**
 * Created by gopher on 24-8-17 下午3:50
 */
#ifndef Q65_PAINTERAREA_H
#define Q65_PAINTERAREA_H

#include <QWidget>
#include <QPen> //这个类是用来画线的提供了一些画线的函数
#include <QBrush> //画刷这个类用来,设置颜色和填充模式
#include <QColor>
#include <QRect>
#include <QPainter>
class painterArea : public QWidget{
    Q_OBJECT

public:

    painterArea(QWidget *parent = nullptr);
    ~painterArea();
    enum shape{Line,//线形
        rectangles,// 矩形
        circles,// 圆形
        ellipses,// 椭圆
        polygons};// 多边形

    void setShape(shape s); //设置形状
    void setPen(QPen p); //设置画笔
    void setBrush(QBrush b); //设置画刷

    void paintEvent(QPaintEvent *event) override; //重写paintEvent方法 绘制事件
    void setfillrule(Qt::FillRule rule); //设置填充颜色

private:
    shape currentShape; //当前形状
    QPen pen; //画笔
    QBrush brush; //画刷
    Qt::FillRule fillRule; //填充规则
};


#endif //Q65_PAINTERAREA_H

/**
 * Created by gopher on 24-8-17 下午3:50
 */
#include "painterArea.h"

painterArea::painterArea(QWidget *parent) : QWidget(parent){


    this->setPalette(QPalette(Qt::white));//设置背景颜色
    this->setAutoFillBackground(true);//设置自动填充背景
    this->setMinimumSize(400, 500);//设置最小尺寸


}

void painterArea::setShape(shape s){
    currentShape=s;
    this->update();
} //设置形状

void painterArea::setPen(QPen p){
    pen=p;
    this->update();
} //设置画笔
void painterArea::setBrush(QBrush b){
    brush=b;
    this->update();
} //设置画刷

void painterArea::paintEvent(QPaintEvent *event) {
    QPainter painter(this);
    painter.setPen(pen);
    painter.setBrush(brush);

    QRect rect(100, 100, 200, 200);

    switch(currentShape){
        case Line://画线
            painter.drawLine(rect.topLeft(), rect.bottomRight());
            break;

        case rectangles://画矩形
            painter.drawRect(rect);
            break;
        default:
            break;
    }
}


void painterArea::setfillrule(Qt::FillRule rule){
    fillRule=rule;
    this->update();//更新界面

} //设置填充颜色


painterArea::~painterArea(){}
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

#include <QLabel>
#include <QComboBox>
#include <QGridLayout>
#include "painterArea.h"
class Widget : public QWidget
{
    Q_OBJECT


public:
    Widget(QWidget *parent = nullptr);
    ~Widget();


private:

    painterArea *mypainterArea;

    QLabel *label;
    QComboBox *comboBox;
    QGridLayout *layout;

public slots:
    void change(int index);
};
#endif // WIDGET_H

#include "widget.h"
#include "painterArea.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    mypainterArea=new painterArea;
    layout=new QGridLayout;
    comboBox=new QComboBox;
    this->setWindowTitle("绘图测试");
    label=new QLabel("请选择画笔颜色:");

    comboBox->addItem("Line",painterArea::Line);
    comboBox->addItem("Rect",painterArea::rectangles);

    layout->addWidget(mypainterArea,0,0,1,2);
    layout->addWidget(label,1,0);
    layout->addWidget(comboBox,1,1);
    this->setLayout(layout);

    connect(comboBox,SIGNAL(currentIndexChanged(int)),
            this,SLOT(change(int)));
}

Widget::~Widget() {}


void Widget::change(int index){
    painterArea::shape sp= painterArea::shape(comboBox->itemData(index,Qt::UserRole).toInt());
    mypainterArea->setShape(sp);

}

绘图双缓冲机制

Q66项目

GraphicsView 绘图框架设计

GraphicsView 是 Qt 框架中的一个类,用于显示和交互二维图形项(QGraphicsItem)。它提供了一个高级的、可缩放的视图,适用于需要复杂图形界面和交互的应用程序,如图形编辑器、地图查看器等。


QObject
  ↑
QWidget
  ↑
QFrame
  ↑
QGraphicsView

关键特性
缩放和滚动:支持通过鼠标或编程方式进行缩放和滚动。
图形项:可以添加各种图形项,如矩形、椭圆、文本等。
事件处理:支持鼠标、键盘等事件的处理。
碰撞检测:可以检测图形项之间的碰撞。
分组和层次:支持图形项的分组和层次管理。
主要类和方法
QGraphicsView:视图类,用于显示 QGraphicsScene 中的内容。

            setScene(scene): 设置要显示的场景。
            setDragMode(mode): 设置拖动模式,如平移、选择等。
            scale(sx, sy): 缩放视图。
QGraphicsScene:场景类,管理图形项。
            
            addItem(item): 添加图形项到场景中。
            removeItem(item): 从场景中移除图形项。
            items(): 获取场景中的所有图形项。
QGraphicsItem:图形项基类,有许多子类如 QGraphicsRectItem, QGraphicsEllipseItem, QGraphicsTextItem 等。
            
            setPos(x, y): 设置图形项的位置。
            setBrush(brush): 设置填充颜色。
            setPen(pen): 设置边框颜色和样式。

QGraphicsScene 是 Qt 中用于管理大量二维图形项(如线条、矩形、文本等)的类。它提供了一个场景,可以在其中添加、删除和管理这些图形项。QGraphicsScene 本身并不直接负责绘制这些图形项,而是通过 QGraphicsView 来显示和交互。

QGraphicsView 是 Qt 中用于显示 QGraphicsScene 内容的类。它提供了一个视图窗口,可以在其中显示和交互场景中的图形项。QGraphicsView 支持缩放、平移和旋转等操作,并且可以处理用户输入事件。

QGraphicsItem 是 Qt 中用于表示图形场景中可绘制对象的基类。它是所有图形项的抽象基类,提供了基本的绘图、事件处理和变换功能。通过继承 QGraphicsItem,可以创建自定义的图形项,并在 QGraphicsScene 中使用。

示例: 图片缩放倾斜旋转

#ifndef PIXITEM_H
#define PIXITEM_H


#include <QGraphicsItem> //图元类
#include <QPixmap>//位图类
#include<QPainter>//画笔类
class PixItem : public QGraphicsItem
{
public:
    PixItem(QPixmap *pix);

private:
    QPixmap  pix; //位图对象

public:
    //返回图元的边界矩形
    QRectF boundingRect() const override;

    //绘制图元
    //@Param painter 画笔对象
    //@Param option 样式选项
    //@Param widget 绘制的窗口
    void paint(QPainter *painter,
               const QStyleOptionGraphicsItem *option,
               QWidget *widget) override;
};

#endif // PIXITEM_H

#include "pixitem.h"

#include <QGraphicsItem> //图元类
#include <QPixmap>//位图类
#include<QPainter>//画笔类
//构造函数
//@Param pixmap 位图对象
PixItem::PixItem(QPixmap *pixmap) {
    pix = *pixmap; //设置位图


}


//返回图元的边界矩形
QRectF PixItem::boundingRect() const {
    //返回位图的矩形
    //@Param x 矩形左上角x坐标
    //@Param y 矩形左上角y坐标
    //@Param w 矩形宽度
    //@Param h 矩形高度
    return QRectF(-2-pix.width() / 2, -2-pix.height() / 2, pix.width()+4, pix.height()+4);
};

//绘制图元
//@Param painter 画笔对象
//@Param option 样式选项
//@Param widget 绘制的窗口
void PixItem::paint(QPainter *painter,
           const QStyleOptionGraphicsItem *option,
           QWidget *widget) {

    //绘制位图
    //@Param x 绘制左上角x坐标
    //@Param y 绘制左上角y坐标
    //@Param pixmap 位图对象
    painter->drawPixmap(-pix.width() / 2, -pix.height() / 2, pix);//此时-pix.width() / 2, -pix.height() / 2, pix表示位图绘制的位置

};
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QGraphicsScene>//图形场景
#include <QGraphicsView>//图形视图
#include <QFrame>//框架
#include <QHBoxLayout>//水平布局
#include <QVBoxLayout>//垂直布局
#include <QSlider>//滑动条
#include <QGroupBox>//组合框
#include "pixitem.h"//自定
#include <QPushButton>//按钮
#include <QLabel>
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
public:
    void CreateControlFrame();//创建控制面板

private:
    int iAngle;//旋转角度
    qreal scalevalue;//缩放比例
    qreal skewvalue;//倾斜比例

    QSlider *rotateslider;//旋转滑动条
    QSlider *scaleslider;//缩放滑动条
    QSlider *skewslider;//倾斜滑动条


    QGraphicsView *view;//图形视图
    QFrame *controlFrame;//控制面板
    PixItem *pixItem;//图片项
private slots:
    void rotateFunc(int angle);//旋转
    void scaleFunc(int value);//缩放
    void skewFunc(int value);//倾斜
    void resetFunc();//重置


};
#endif // WIDGET_H

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    setWindowTitle("图形视图框架");
    iAngle = 0;//旋转角度
    scalevalue = 1;//缩放比例
    skewvalue = 0;//倾斜角度

    //场景
    QGraphicsScene *scene = new QGraphicsScene();//创建场景

    //添加图形
    QString pat("C://Users//gophe//OneDrive//图片//螢幕擷取畫面//1.png");
    QPixmap *pixmap= new QPixmap(pat);
    //自定类
    pixItem= new PixItem(pixmap);

    //添加到场景
    scene->addItem(pixItem);
    //设置在pixItem场景中的位置
    pixItem->setPos(0,0);//设置位置



    //视图
    view= new QGraphicsView;
    view->setScene(scene);//设置场景
    //设置scene位置
    view->setMinimumSize(400, 400);//设置最小尺寸
    //设置对齐方式
    view->setAlignment(Qt::AlignLeft | Qt::AlignTop|Qt::AlignHCenter|Qt::AlignVCenter);
    //设置背景颜色
    view->setBackgroundBrush(QBrush(Qt::white));



    //控制面板
    controlFrame=new QFrame;
    //添加控件
    CreateControlFrame();

    //设置布局
    QHBoxLayout *mainLayout = new QHBoxLayout;//创建布局
    mainLayout->addWidget(view);//添加视图
    mainLayout->addWidget(controlFrame);//添加控制面板
    setLayout(mainLayout);//设置整体布局


}

Widget::~Widget() {}


void Widget::rotateFunc(int angle) {
    view->rotate(angle-iAngle);//调用了视图的旋转方法
    iAngle = angle;//更新旋转角度
}
//缩放
void Widget::scaleFunc(int value){
    qreal factor ;
    if (value>scalevalue){//如果放大
        factor=pow(1.1,value-scalevalue); //计算放大比例
    }else{
        factor=pow(1/1.1,scalevalue-value); //计算缩小比例
    }

    view->scale(factor,factor);//调用了视图的缩放方法
    scalevalue = value;//更新缩放比例
}
//倾斜
void Widget::skewFunc(int value){

    qreal angle = value*1.0/180*M_PI; //计算倾斜角度

    view->shear(angle-skewvalue,0);//调用了视图的倾斜方法
    skewvalue = angle;//更新倾斜角度
}
//重置
void Widget::resetFunc(){
    view->resetTransform();//调用了视图的重置方法
    iAngle = 0;//旋转角度
    scalevalue = 1;//缩放比例
    skewvalue = 0;//倾斜角度
    //更新控件
    rotateslider->setValue(0);
    scaleslider->setValue(1);
    skewslider->setValue(0);



}
//创建控制面板
void  Widget::CreateControlFrame(){
    QLabel *rotatelabel = new QLabel("旋转");
    QLabel *scalelabel = new QLabel("缩放");
    QLabel *skewlabel = new QLabel("倾斜");

    //旋转
    rotateslider = new QSlider;
    rotateslider->setOrientation(Qt::Horizontal);//水平方向
    rotateslider->setMinimum(-360);//最小值
    rotateslider->setMaximum(360);最大值
    rotateslider->setValue(0);//初始值
    connect(rotateslider, SIGNAL(valueChanged(int)),
            this, SLOT(rotateFunc(int)));

    //缩放
    scaleslider = new QSlider;
    scaleslider->setOrientation(Qt::Horizontal);//水平方向
    scaleslider->setMinimum(1);//最小值
    scaleslider->setMaximum(10);//最大值
    scaleslider->setValue(1);//初始值
    connect(scaleslider, SIGNAL(valueChanged(int)),
            this, SLOT(scaleFunc(int)));
    //倾斜
    skewslider = new QSlider;
    skewslider->setOrientation(Qt::Horizontal);//水平方向
    skewslider->setMinimum(-180);//最小值
    skewslider->setMaximum(180);//最大值
    skewslider->setValue(0);//初始值
    connect(skewslider, SIGNAL(valueChanged(int)),
            this, SLOT(skewFunc(int)));
    //重置按钮

    QPushButton *resetbutton = new QPushButton("重置");
    connect(resetbutton, SIGNAL(clicked()),
            this, SLOT(resetFunc()));
    //布局

    QVBoxLayout *controlLayout = new QVBoxLayout;
    controlLayout->addWidget(rotatelabel);
    controlLayout->addWidget(rotateslider);
    controlLayout->addWidget(scalelabel);
    controlLayout->addWidget(scaleslider);
    controlLayout->addWidget(skewlabel);
    controlLayout->addWidget(skewslider);

    controlLayout->addWidget(resetbutton);

    controlFrame->setLayout(controlLayout);


}
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在使用Qt和Halcon进行图像处理时,可以通过在窗口上绘制ROI(兴趣区域)来选择特定区域进行分析和处理。 首先,需要在Qt窗口中创建一个用于显示图像的QLabel控件。然后,通过Halcon的API函数,将图像从Halcon的数据类型转换为Qt能够显示的数据类型,并将其显示在QLabel控件上。 接下来,可以使用Qt的绘图功能来实现ROI的绘制。一种常用的方法是使用鼠标事件来捕捉用户的交互操作。通过重写QLabel控件的鼠标事件函数,可以监听鼠标按下、移动和释放的动作,并根据鼠标的位置在窗口上绘制ROI。 具体操作包括: 1. 在QLabel控件的构造函数中设置鼠标追踪功能,以便能够捕捉到鼠标移动的事件。 2. 重写QLabel控件的鼠标事件函数,例如mousePressEvent、mouseMoveEvent和mouseReleaseEvent函数。在这些函数中,根据鼠标的位置和操作来绘制ROI。 3. 定义一个ROI类,用于保存ROI的坐标和属性。每次鼠标操作(按下、移动和释放)时,更新ROI的坐标和属性,并在窗口上重绘ROI。 4. 根据应用的需求,可以使用不同的图形绘制API,例如Qt的绘图函数或Halcon的绘图函数,来绘制ROI。例如,可以使用Qt的QPainter对象在窗口上绘制矩形、圆形等形状。 5. 在窗口上绘制ROI后,可以通过ROI的坐标和属性,对选择的区域进行进一步的处理和分析。 通过上述步骤,我们可以在Qt和Halcon的结合中实现窗口绘制ROI的功能,以实现图像处理中对特定区域的选择和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可能只会写BUG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值