数据专栏

智能大数据搬运工,你想要的我们都有

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

「深度学习福利」大神带你进阶工程师,立即查看>>>
参考:
https://blog.csdn.net/xuancailinggan/article/details/77487780
1、创建一个QtGUI应用,基类选择QWidget
2、初始化 listWidget = new QListWidget(this);
this->setGeometry(100,100,200,200); listWidget = new QListWidget(this); listWidget->setGeometry(50,50,100,100); //设置位置
2、尾部追加
1.1、方法1 //QListWidget追加数据方法1:少量追加 listWidget->addItem(new QListWidgetItem(QIcon(":/resourece/qtblog.png"), tr("第0行")));
1.2、方法2 QListWidgetItem *item = new QListWidgetItem; item->setText(tr("第0行")); item->setIcon(QIcon(":/resourece/qtblog.png")); listWidget->addItem(item);
1.3、方法3 new QListWidgetItem(QIcon(":/resourece/qtblog.png"), tr("第0行"), listWidget);
2.1、批量追加 //QListWidget追加数据方法2:批量追加 QStringList strList; strList << QString("第2行") << QString("第3行") << QString("第4行"); listWidget->addItems(strList);
2.2、建立一个继承自QListWidget的窗口,构造函数: Widget::Widget(QWidget *parent) : QListWidget(parent) { QStringList strList{tr("项目0"), tr("项目1"), tr("项目2"), tr("项目3")}; this->addItems(strList); }
//QListWidget追加数据方法1:少量追加 QListWidgetItem *item = new QListWidgetItem; item->setText("方法1"); listWidget->addItem(item); //QListWidget追加数据方法2:批量追加 QStringList strList; strList << QString("第2行") << QString("第3行") << QString("第4行"); listWidget->addItems(strList); //任意位置插入:因为item指向同一块内存,所以修改了原来的0行内容 item->setText("插入0"); listWidget->insertItem(0, item);
//QListWidget追加数据方法1:少量追加 QListWidgetItem *item = new QListWidgetItem; item->setText("方法1"); listWidget->addItem(item); //QListWidget追加数据方法2:批量追加 QStringList strList; strList << QString("第2行") << QString("第3行") << QString("第4行"); listWidget->addItems(strList); //任意位置插入:覆盖插入 QListWidgetItem *item1 = new QListWidgetItem; item1->setText("插入0"); listWidget->insertItem(0, item1);
addItems()和insertItem()的区别在于前者在末尾追加数据,后者可以在任意位置插入数据。
3、添加图标 item->setIcon(QIcon(":/resourece/qtblog.png"));
4、多选模式:[默认单选SingleSelection] listWidget->setSelectionMode(QAbstractItemView::ExtendedSelection);

5、图标显示
前面的列表是小图标显示,我们也可以更改为图标显示 listWidget->setViewMode(QListView::IconMode); //图标显示 listWidget->setIconSize(QSize(200, 200)); listWidget->setResizeMode(QListWidget::Adjust); new QListWidgetItem(QIcon(":/resourece/rectangle.png"), tr("第0行"), listWidget); new QListWidgetItem(QIcon(":/resourece/circle.png"), tr("第1行"), listWidget);
多媒体
2018-09-14 15:14:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
http://www.qter.org/portal.php?mod=view&aid=62
1、新建QT控制台应用,在.pro中添加
QT += core xml
2、源码修改 #include #include #include int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QFile file("my.xml");//建立指向my.xml文件的QFile对象. if(!file.open(QFile::WriteOnly | QFile::Text)) //以文本方式,只读打开文件 { qDebug() << "打开失败"; return -1; } QXmlStreamWriter stream(&file); stream.setAutoFormatting(true); stream.writeStartDocument(); stream.writeStartElement("bookmark"); stream.writeAttribute("href", "http://qt.io/"); stream.writeEndElement(); stream.writeEndDocument(); file.close(); qDebug() << "写入完成"; return a.exec(); }


写入不成功:
写入成功
多媒体
2018-09-14 13:50:00
「深度学习福利」大神带你进阶工程师,立即查看>>> https://www.jianshu.com/p/5f20e2cd3ee0 #include "widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) { this->setBackgroundRole(QPalette::Light); this->setAutoFillBackground(true); resize(400,360); setWindowTitle("Rubber"); rubberBand = NULL; } Widget::~Widget() { } // QPoint origin; void Widget::mousePressEvent(QMouseEvent *e) { origin = e->pos(); if(!rubberBand){ rubberBand = new QRubberBand(QRubberBand::Rectangle, this); } rubberBand->setGeometry(QRect(origin, QSize()));//设置了橡皮筋线的位置及大小 rubberBand->show(); } void Widget::mouseMoveEvent(QMouseEvent *e) { if(rubberBand) rubberBand->setGeometry(QRect(origin,e->pos()).normalized()); //normalized() 函数返回的也是一个QRect的对象,不过该对象的长和宽的值都是大于零时值 } void Widget::mouseReleaseEvent(QMouseEvent *e) { // if(rubberBand) // rubberBand->hide(); //当鼠标松开时,橡皮筋线就可以隐藏了 }
多媒体
2018-09-06 17:03:00
「深度学习福利」大神带你进阶工程师,立即查看>>> scene=new QGraphicsScene(-300,-200,600,200); //设置scene的大小和坐标,这样,当窗口大小变化时scene并不会变化 ui->View->setScene(scene); //与view关联 ui->View->setCursor(Qt::CrossCursor); //设置鼠标 ui->View->setDragMode(QGraphicsView::ScrollHandDrag); // // this->setCentralWidget(ui->View); //error: 'class Widget' has no member named 'setCentralWidget'
/*
在QGraphicView中提供了三种拖动模式,分别是:
QGraphicsView::NoDrag :忽略鼠标事件,不可以拖动。
QGraphicsView::ScrollHandDrag :光标变为手型,可以拖动场景进行移动。
QGraphicsView::RubberBandDrag :使用橡皮筋效果,进行区域选择,可以选中一个区域内的所有图形项。
我们可以利用setDragMode()函数进行相应设置。
*/
多媒体
2018-09-06 11:41:00
「深度学习福利」大神带你进阶工程师,立即查看>>> Widget::Widget(QWidget *parent) : QWidget(parent) { button = new QPushButton("OK"); button->setDefault(true); //默认按钮:当按下enter键时,会默认选中[点击]button button->setParent(this); connect(button, SIGNAL(clicked()), this, SLOT(slotButtonClicked())); } void Widget::slotButtonClicked() { static int i = 0; //局部静态变量 qDebug() << "slotButtonClicked" << i++; }
一般情况下,焦点在主窗口上,但是如果我们需要处理子窗口,需要设置 #include "widget.h" #include #include #include Widget::Widget(QWidget *parent) : QWidget(parent) { QVBoxLayout *layout = new QVBoxLayout(this); QPushButton *button2, *button3; button = new QPushButton("OK"); layout->addWidget(button); layout->addWidget(button2 = new QPushButton("cancel")); layout->addWidget(button3 = new QPushButton("quit")); button->setDefault(true); //默认按钮:当按下enter键时,会默认选中[点击]button button2->setDefault(true); //根据上下箭头切换焦点[V],默认焦点为第一个设置的setDefault button3->setDefault(true); connect(button, SIGNAL(clicked()), this, SLOT(slotButtonClicked())); connect(button2, SIGNAL(clicked()), this, SLOT(slotButtonClicked())); connect(button3, SIGNAL(clicked()), this, SLOT(slotButtonClicked())); } void Widget::slotButtonClicked() { QPushButton *button = (QPushButton *)sender(); qDebug() << button->text(); }
多媒体
2018-09-06 11:24:00
「深度学习福利」大神带你进阶工程师,立即查看>>> Widget::Widget(QWidget *parent) : QWidget(parent) { QLineEdit *edit = new QLineEdit(this); connect(edit, SIGNAL(returnPressed()), this, SLOT(slotEditClicked())); } void Widget::slotEditClicked() { QLineEdit* button = (QLineEdit*)sender(); qDebug() << button->text(); }
多媒体
2018-09-05 19:56:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
QLabel没有setDefault函数。
不能直接在QLabel上绘画,上面的Pixmap会将画出来的图像挡住 #include "widget.h" #include #include #include #include #include Widget::Widget(QWidget *parent) : QWidget(parent) { label = new QLabel(); label->setParent(this); label->resize(size()); label->setPixmap(QPixmap("F:\\MyCode\\qtblog.png")); } void Widget::slotButtonClicked() { } Widget::~Widget() { } void Widget::mousePressEvent(QMouseEvent *ev) { startPos = ev->pos(); update(); } void Widget::mouseMoveEvent(QMouseEvent *ev) { endPos = ev->pos(); qDebug() << ev->pos(); } void Widget::mouseReleaseEvent(QMouseEvent *ev) { endPos = ev->pos(); } void Widget::paintEvent(QPaintEvent *ev) { QPainter painter(this); painter.drawLine(startPos, endPos); painter.end(); }
多媒体
2018-09-05 19:37:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1、widget.h中: public: Widget(QWidget *parent = 0); ~Widget(); void paintEvent(QPaintEvent *ev); void mousePressEvent(QMouseEvent *ev); void mouseMoveEvent(QMouseEvent *ev); void mouseReleaseEvent(QMouseEvent *ev); QVector_lines;
2、widget.cpp中 #include #include void Widget::paintEvent(QPaintEvent *) { QPainter p(this); for(int i = 0; i < _lines.size() - 1; ++i){ p.drawLine(_lines.at(i), _lines.at(i+1)); } } void Widget::mouseMoveEvent(QMouseEvent *ev) { _lines.append(ev->pos()); update(); } void Widget::mousePressEvent(QMouseEvent *ev) { _lines.append(ev->pos()); } void Widget::mouseReleaseEvent(QMouseEvent *ev) { _lines.append(ev->pos()); }
多媒体
2018-09-05 18:01:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
如果我们用painter一个一个的绘制直线,圆等在控件上,绘制效率会不高。为了提高效率,我们可以设置一个画布pixmap,将所有的基础图形画布上,然后把画布画在控件上。 #include void Widget::paintEvent(QPaintEvent *) { QPixmap pixmap(size()); //将画布的大小设置为和widget一样的 QPainter painter(&pixmap); //在画布上常见一个画家 painter.setBrush(Qt::yellow); painter.setPen(QPen(Qt::red, 2, Qt::DashLine)); painter.drawEllipse(QPoint(95, 333), 50, 50); painter.drawText(QPoint(50, 50), "Hello world"); painter.end(); //画完了 painter.begin(this); //在Widget上开始绘制 painter.drawPixmap(0, 0, pixmap); //在控件上绘制pixmap图像 painter.drawLine(QPoint(50, 50), QPoint(60, 10)); }
多媒体
2018-09-05 17:30:00
「深度学习福利」大神带你进阶工程师,立即查看>>> #include void Widget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.translate(100, 100); //坐标向前平移 painter.drawLine(QPoint(0, 0), QPoint(100, 100)); painter.translate(-100, -100); painter.setPen(QPen(Qt::red)); painter.drawLine(QPoint(0, 0), QPoint(50, 50)); painter.drawLine(QPoint(50, 50), QPoint(100, 50)); painter.rotate(90); painter.setPen(QPen(Qt::green)); painter.drawLine(QPoint(50, -100), QPoint(100, -100)); //QTransform是对translate、rotate、scale等坐标操作的封装 QTransform transform; // transform.translate(20, 20); transform.rotate(-90); transform.scale(.5, .5); painter.setTransform(transform, true); //truebiao's表示叠加之前的坐标 painter.drawLine(QPoint(50, 50), QPoint(60, 10)); }
多媒体
2018-09-05 17:19:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1、如果想要使用QPainter在某个控件上绘图,必须重写这个控件的PaintEvent事件。否则“ QWidget::paintEngine: Should no longer be called ”
2、对于 inline void QPainter ::drawEllipse( const QPoint ¢er, int rx, int ry)
center是椭圆圆心,当rx = ry时,这个就是一个圆了。
p.drawEllipse(QPoint(95, 333), 50, 50);
p.drawEllipse(QPoint(95, 333), 70, 50);
3、画家设置画笔,画刷,字体以及反走样 void Widget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); //反锯齿 painter.setPen(QPen(Qt::red, 2, Qt::DashLine)); painter.setBrush(Qt::yellow); painter.setFont(QFont("aaa", 40, 700, true)); //"aaa"系统会默认挑选一个预先定义的字体 painter.drawText(QPoint(100, 100), "Hello world"); painter.drawEllipse(QPoint(100, 100), 70, 50); }
多媒体
2018-09-05 17:00:00
「深度学习福利」大神带你进阶工程师,立即查看>>> //键盘事件返回一个ASCII码:不区分大小写 #include #include void Widget::keyPressEvent(QKeyEvent *event) { int key = event->key(); qDebug() << key; char a = (char)key; qDebug() << (char)a; }
多媒体
2018-09-05 16:25:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
比如鼠标点击消息:QApplication先获取消息--->具体应该处理的窗口::event()---> event()根据消息类型来调用具体的虚函数
1)可以重载具体的虚函数,来实现对消息的响应
2)可以重载event函数,用来处理或者截取消息。但是重写玩event之后,要把事件重新传递给具体应该处理的窗口,然后这个窗口又传递给QApplication。例如: #include bool Widget::event(QEvent *event) { return QWidget::event(event); }
event相当于一个开关,可以在这个开关里面关闭某个消息机制:比如如果检测到鼠标左键按下时,直接返回。 #include bool Widget::event(QEvent *event) { if(ev->type() == QEvent::MouseButtonPress) return true; return QWidget::event(event); }
2、重写具体的虚函数以实现对事件的处理,比如鼠标按下事件: #include #include void Widget::mousePressEvent(QMouseEvent *event) { QPoint pt = event->pos(); //获取鼠标按下的位置 qDebug() << pt; if(ev->button() == Qt::LeftButton) { if(ev->modifiers() == Qt::ControlModifier) { // handle with Control; return; } // handle2 without control; } }
鼠标移动事件: //构造函数中添加: this->setMouseTracking(true); //不需要按下只要鼠标在widget上移动就能感应 //如果不将setMouseTracking设置为true,那么只有shu鼠标按下并且移动才能有mouseMoveEvent事件发生 void Widget::mouseMoveEvent(QMouseEvent *) { static int i=0; qDebug() << "mouse move"<< i++; }
鼠标事件默认情况下只能由一个窗口处理,比如如果在widget上放置了一个按钮,当鼠标在按钮上移动时,mouseMoveEvent不能感应,应为mouseMoveEvent是Widget的,不是Button的
多媒体
2018-09-05 16:18:00
「深度学习福利」大神带你进阶工程师,立即查看>>> #include "widget.h" #include // disply static text, or image #include #include // single line #include #include #include #include // multi lines, rich text #include // readonly textedit #include // #include // 模拟方式显示数值 #include // 数字 #include #include #include #include // 不介绍,不算控件 #include #include #include #include #include #include Widget::Widget(QWidget *parent) : QWidget(parent) { QVBoxLayout* lay = new QVBoxLayout(this); QPushButton* button; QLabel* label; lay->addWidget(label = new QLabel("baidu")); connect(label, &QLabel::linkActivated, [](QString str){ qDebug() << str; }); // label->setPixmap(QPixmap("../qtblog.png")); QRadioButton* radio; lay->addWidget(radio = new QRadioButton("Radio")); radio->setStyleSheet("QRadioButton {font:bold 16px; color:red; padding:5px}"); connect(radio, &QRadioButton::clicked, [](bool v){ qDebug() << v; }); QCheckBox *check; lay->addWidget(check = new QCheckBox("check box")); connect(check, &QCheckBox::clicked, [](bool v){ qDebug() << v; }); QComboBox* combo; lay->addWidget(combo = new QComboBox()); combo->addItem("Select item1"); combo->addItem("Select item2"); combo->setEditable(true); connect(combo, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotComboBoxIndexChanged(QString))); combo->setCompleter(new QCompleter(combo->model())); QTextEdit* edit; //可以在QTextEdit中显示图片 lay->addWidget(edit = new QTextEdit); edit->setText( "" "" "" "
head1head2
value1value2
value3value4

" "" ); edit->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); //添加滚动条 edit->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//水平方向滚动条关闭 // _edit = edit; // connect(edit, &QTextEdit::textChanged, [&](){ // // QTextEdit* edit = (QTextEdit*)this->sender(); // qDebug() << _edit->toPlainText(); // }); QGroupBox* group; lay->addWidget(group = new QGroupBox("Some items")); QHBoxLayout* hBoxLay; group->setLayout(hBoxLay = new QHBoxLayout); hBoxLay->addWidget(new QPushButton("aaaa")); hBoxLay->addWidget(new QPushButton("aaaa")); QSlider* slider; QSpinBox* spinBox; lay->addWidget(slider = new QSlider(Qt::Horizontal)); slider->setMaximum(100); slider->setMinimum(0); lay->addWidget(spinBox = new QSpinBox); spinBox->setMaximum(100); spinBox->setMinimum(0); connect(slider, SIGNAL(valueChanged(int)), spinBox, SLOT(setValue(int))); connect(spinBox, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int))); QLCDNumber* lcd; lay->addWidget(lcd = new QLCDNumber(10)); lcd->display(12345); lcd->setMode(QLCDNumber::Hex); lcd->setSegmentStyle(QLCDNumber::Outline); } void Widget::slotComboBoxIndexChanged(const QString & str) { qDebug() << "slotComboBoxIndexChanged" << str; }
多媒体
2018-09-05 15:13:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1、让lineEdit只能输入一个大写字母
建立工程,UI界面中放置一个lineEdit,转到槽: void MainWindow::on_lineEdit_cursorPositionChanged(int arg1, int arg2) { QRegExp reg("[A-Z]"); ui->lineEdit->setValidator(new QRegExpValidator(reg, this)); }
多媒体
2018-09-10 20:10:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
mencoder 1.mp4 2.mp4 -oac pcm -ovc copy -o ok.mp4
多媒体
2018-09-08 11:13:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
widget.h #ifndef WIDGET_H #define WIDGET_H #include #include #include #include #include class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); private: void mousePressEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); void mouseReleaseEvent(QMouseEvent *event); void paintEvent(QPaintEvent *event); QVector>_lines; }; #endif // WIDGET_H
widget.cpp //当鼠标按下时: 创建一条新线压入vector。并且将当前鼠标位置作为新线的起点。 void Widget::mousePressEvent(QMouseEvent *event){ QVectorline; _lines.append(line); QVector&last_line = _lines.last(); //注意:引用而不是新建,否则不是同一个内存 last_line.append(event->pos()); update(); //注意一定要记得update } //如果鼠标正在移动:将这些移动的点都压入最上面也就是最新的线 #include void Widget::mouseMoveEvent(QMouseEvent *event){ // qDebug() << "mouseMoveEvent"; if(!_lines.size()){ //保证安全 QVectorline; _lines.append(line); } QVector&last_line = _lines.last(); last_line.append(event->pos()); update(); //注意一定要记得update } //如果鼠标松开,这个点就是新线的终点,只需要把此时的点压入最新线就可以了 void Widget::mouseReleaseEvent(QMouseEvent *event){ QVector&last_line = _lines.last(); last_line.append(event->pos()); update(); //注意一定要记得update } //在鼠标事件中记录线的轨迹,在绘画事件中绘制轨迹 void Widget::paintEvent(QPaintEvent *event){ //创建画笔 // QPainter painter(this); //vector数组中有几条线 // for(int i = 0; i < _lines.size(); ++i){ //一条条绘制 // QVectorline = _lines.at(i); // for(int j = 0; j < line.size(); ++j){ // QPoint tj = line.at(j); // painter.drawPoint(tj); //不要画点,画线有专门的函数 // } // } QPainter p(this); for(int i=0; i<_lines.size(); ++i) { const QVector& line = _lines.at(i); for(int j=0; j
多媒体
2018-09-07 20:36:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
例子:比如QWidget发送消息给QApplication
在widget.cpp中重载event事件 #include bool Widget::event(QEvent *e) { if(e->type() == QEvent::Close) //因为Widget的父类是app { qDebug() << "User event is comming"; } return QWidget::event(e); }
接收事件 #include "widget.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); // 发送一个Event给MyWidget qDebug() << "begin send"; a.postEvent(&w, new QEvent(QEvent::User)); // sendEvent,建议用postEvent qDebug() << "end send"; return a.exec(); } //可以在程序任意地方qApp.postEvent(&w, new QEvent(QEvent::User));
多媒体
2018-09-07 19:45:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1、定义一个c++类:MyApplication
MyApplication.h #ifndef MYAPPLICATION_H #define MYAPPLICATION_H #include class MyApplication:public QApplication { public: MyApplication(int argc, char*argv[]):QApplication(argc, argv) { } bool notify(QObject *, QEvent *); }; #endif // MYAPPLICATION_H
MyApplication.cpp #include "myapplication.h" #include #include #include bool MyApplication::notify(QObject *object, QEvent *event){ if(this->topLevelWidgets().count()>0) { QWidget* mainWnd = this->topLevelWidgets().at(0); if(object==(QObject*)mainWnd && event->type() == QEvent::Move) { // do ... qDebug() << "mainwnd is clicked"; } } return QApplication::notify(object, event); }

main.cpp #include "widget.h" #include "myapplication.h" #include int main(int argc, char *argv[]) { MyApplication a(argc, argv); Widget w; w.show(); return a.exec(); }
多媒体
2018-09-07 19:21:00
「深度学习福利」大神带你进阶工程师,立即查看>>> #include "widget.h" #include Widget::Widget(QWidget *parent) : QWidget(parent) { _button = new QPushButton("this button", this); connect(_button, SIGNAL(clicked()), this, SLOT(close())); /*button 给自己安装了一个消息过滤器,那么经过button的消息,都要调用它的消息过滤器函数*/ _button->installEventFilter(this); } #include bool Widget::eventFilter(QObject *watched, QEvent *event) { if(watched == _button){ if(event->type() == QEvent::MouseButtonRelease){ return true; } } return QWidget::eventFilter(watched, event); }
多媒体
2018-09-07 18:44:00
「深度学习福利」大神带你进阶工程师,立即查看>>> void RectItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { QStyleOptionGraphicsItem op; op.initFrom(widget); // // 判断选中时,设置状态为 State_None if (option->state & QStyle::State_Selected){ qreal itemPenWidth = 10; const qreal pad = itemPenWidth / 2; const qreal penWidth = 0; // 边框区域颜色 QColor color = QColor(Qt::red); //绘制实现 painter->setPen(QPen(color, penWidth, Qt::SolidLine)); painter->setBrush(Qt::NoBrush); painter->drawRect(boundingRect().adjusted(pad, pad, -pad, -pad)); // 绘制虚线 painter->setPen(QPen(color, 0, Qt::DashLine)); painter->setBrush(Qt::NoBrush); painter->drawRect(boundingRect().adjusted(pad, pad, -pad, -pad)); qDebug() << "选中"; }else{ } //绘制图标,必须小于边框矩形 painter->setRenderHint( QPainter::Antialiasing ); painter->drawRect(m_x, m_y, m_w, m_h); }
多媒体
2018-09-07 11:27:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
https://blog.csdn.net/qq_20553613/article/details/78538533
多媒体
2018-09-04 08:26:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1、新建QT GUI工程,项目名称“ShapeWidget”, 基类QWidget, 类名ShapeWidget,取消“创建界面”
2、ShapeWidget.h #ifndef SHAPEWIDGET_H #define SHAPEWIDGET_H #include class ShapeWidget : public QWidget { Q_OBJECT public: ShapeWidget(QWidget *parent = 0); ~ShapeWidget(); protected: void mousePressEvent(QMouseEvent *); void mouseMoveEvent(QMouseEvent *); void paintEvent(QPaintEvent *); private: QPoint dragPosition; }; #endif // SHAPEWIDGET_H
3、 #include "shapewidget.h" #include #include #include #include ShapeWidget::ShapeWidget(QWidget *parent) : QWidget(parent) { QPixmap pix; pix.load("F:\\MyCode\\test1.bmp", 0, Qt::AvoidDither|Qt::ThresholdDither|Qt::ThresholdAlphaDither); resize(pix.size()); setMask(QBitmap(pix.mask())); } ShapeWidget::~ShapeWidget() { } void ShapeWidget::mousePressEvent(QMouseEvent *event) { if(event->button()==Qt::LeftButton) { dragPosition =event->globalPos()-frameGeometry().topLeft(); event->accept(); } if(event->button()==Qt::RightButton) { close(); } } void ShapeWidget::mouseMoveEvent(QMouseEvent *event) { if(event->buttons()&Qt::LeftButton) { move(event->globalPos()-dragPosition); event->accept(); } } void ShapeWidget::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.drawPixmap(0,0,QPixmap("F:\\MyCode\\test1.bmp")); }
多媒体
2018-09-03 21:58:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1、新建Qt GUI,基类选择"QMainWindows",取消“创建界面”
2、mainwindows.cpp中修改:模拟一个程序初始化 #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setWindowTitle("Splash Example"); QTextEdit *edit = new QTextEdit; //初始化文本编辑器控件 edit->setText("Splash Example!"); setCentralWidget(edit); resize(600, 450); Sleep(1000); //程序休眠:#include }
3、main.c中实现程序启动画面功能实现 #include "mainwindow.h" #include #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); // 启动画面 QPixmap pixmap("F:\\MyCode\\dcq.jpg"); //设置启动画面 QSplashScreen splash(pixmap); splash.show(); //显示此启动图像 a.processEvents(); //使得程序在显示启动画面的同时还能够响应其他事件 MainWindow w; w.show(); //等待主程序初始化完成之后 splash.finish(&w); //程序启动画面完成 return a.exec(); }
---
多媒体
2018-09-03 21:33:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
1、新建"QT GUI",基类选择"QDialog',取消“创建界面”
2、dialog.cpp中: #ifndef DIALOG_H #define DIALOG_H #include #include #include #include class Dialog : public QDialog { Q_OBJECT public: Dialog(QWidget *parent = 0); ~Dialog(); private: //私有变量声明 QPushButton *colorBtn; QFrame *colorFrame; QGridLayout *mainLayout; private slots: void showColor(); }; #endif // DIALOG_H
3、dialog.cpp中 #include "dialog.h" #include #include Dialog::Dialog(QWidget *parent) : QDialog(parent) { colorBtn = new QPushButton; //控件初始化 colorBtn->setText(tr("颜色标准对话框")); colorFrame = new QFrame; colorFrame->setFrameShape(QFrame::Box); colorFrame->setAutoFillBackground(true); //布局管理 mainLayout = new QGridLayout(this); mainLayout->addWidget(colorBtn, 1, 0); mainLayout->addWidget(colorFrame, 1, 1); // connect(colorBtn, SIGNAL(clicked()), this, SLOT(showColor())); } Dialog::~Dialog() { } void Dialog::showColor() { QColor c = QColorDialog::getColor(Qt::blue); if(c.isValid()){ colorFrame->setPalette(QPalette(c)); } }

4、效果
5、
QColor color = QColorDialog::getColor
(const QColor&initial = Qt::white,
QWidget * parent = 0);
第一个参数:对话框打开时默认选择的颜色(QColor类型)
第二个参数:它的parent
多媒体
2018-09-03 19:55:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
建立一个MainWindows,取消创建Qt
1、添加菜单栏 #include ​ menuBar()->addMenu( "&File" ); menuBar()->addMenu( "&Edit" ); menuBar()->addMenu( "&View" ); menuBar()->addMenu( "&Simulate" ); menuBar()->addMenu( "&Help" );​

2、添加底部状态栏 #include statusBar()->showMessage( "QSimulate has started" );
--
多媒体
2018-09-03 18:02:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
https://www.2cto.com/kf/201806/754213.html
多媒体
2018-09-03 13:14:00
「深度学习福利」大神带你进阶工程师,立即查看>>> #include #include using namespace std; using namespace cv; Rect box; bool drawing_box = false; Rect Eraser; bool drawing_eraser = false; int Eraser_Size = 5; /* * opencv实现橡皮擦功能总结:在鼠标事件中用背景色覆盖矩形的颜色 * 参考://https://blog.csdn.net/zhoufan900428/article/details/45890053 */ void mouse_paint_callback(int event, int x, int y, int flags, void* param); void draw_box( Mat img, CvRect box) { rectangle(img, Point(box.x,box.y), Point(box.x+box.width,box.y+box.height), Scalar(0x00,0xff,0x00) //绿色 ); } void draw_Eraser( Mat img, CvRect Eraser) { rectangle(img, Point(Eraser.x - Eraser_Size,Eraser.y - Eraser_Size), Point(Eraser.x + Eraser_Size,Eraser.y + Eraser_Size), Scalar(0xff,0xff,0xff), //黑色 CV_FILLED //用黑色填充矩形表示橡皮擦 ); } void show_Eraser( Mat img, CvRect Eraser) { rectangle(img, Point(Eraser.x - Eraser_Size,Eraser.y - Eraser_Size), Point(Eraser.x + Eraser_Size,Eraser.y + Eraser_Size), Scalar(0x00,0x00,0x00), //用背景色白色填充 CV_FILLED ); } int main() { box = Rect(-1, -1, 0, 0); Eraser = Rect(-1, -1, 0, 0); Mat srcImage(600, 800, CV_8UC3); srcImage.setTo(Scalar(255, 255, 255)); //设置背景色颜色为白色 Mat tempImage; srcImage.copyTo(tempImage); namedWindow("Paint"); setMouseCallback("Paint", mouse_paint_callback, (void*)&srcImage); while(1){ srcImage.copyTo(tempImage); if(drawing_box) draw_box(tempImage,box); if(drawing_eraser) show_Eraser(tempImage,Eraser); imshow("Paint",tempImage); if(cvWaitKey(15) == 27) break; //wait ESC key } return 0; } void mouse_paint_callback(int event, int x, int y, int flags, void* param) { Mat& image = *(cv::Mat*)param; switch(event) { case CV_EVENT_MOUSEMOVE: //鼠标移动 { if(drawing_box) { cout<< (flags & CV_EVENT_FLAG_SHIFTKEY) << ends << CV_EVENT_FLAG_SHIFTKEY << "\n"; if((flags & CV_EVENT_FLAG_SHIFTKEY) == CV_EVENT_FLAG_SHIFTKEY) { //SHIFT键被压下 if (box.x>box.y) { box.width = x - box.x; box.height= (y - box.y > 0)?abs(x - box.x):-abs(x - box.x); } else { box.width = (x - box.x > 0)?abs(y - box.y):-abs(y - box.y); box.height= y - box.y; } } else { box.width = x - box.x; box.height= y - box.y; } } if(drawing_eraser) { Eraser = cvRect(x,y,0,0); draw_Eraser(image,Eraser); //用黑色方块表示一个橡皮擦 } } break; case CV_EVENT_LBUTTONDOWN: //左键压下 { drawing_box = true; box = Rect(x,y,0,0); } break; case CV_EVENT_RBUTTONDOWN: //右键压下 { drawing_eraser = true; Eraser = Rect(x,y,0,0); draw_Eraser(image,Eraser); } break; case CV_EVENT_LBUTTONUP: //左键弹起 { drawing_box = false; if(box.width<0) { box.x += box.width; box.width *= -1; } if(box.height<0) { box.y += box.height; box.height *= -1; } draw_box(image,box); } break; case CV_EVENT_RBUTTONUP: //右键弹起 { drawing_eraser = false; } break; } }
多媒体
2018-09-03 10:57:00
「深度学习福利」大神带你进阶工程师,立即查看>>> 1、新建GUI应用,项目名称"StackedWidget",基类选择"QDialog",类名命名为StackDlg,取消创建界面
stackDlg.h #ifndef STACKDLG_H #define STACKDLG_H #include #include #include #include #include class StackDlg : public QDialog { Q_OBJECT public: StackDlg(QWidget *parent = 0); ~StackDlg(); private: QListWidget *list; QStackedWidget *stack; QLabel *label1; QLabel *label2; QLabel *label3; }; #endif // STACKDLG_H
stackwindows.cpp #include "stackdlg.h" #include // StackDlg::StackDlg(QWidget *parent) : QDialog(parent) { setWindowTitle(tr("StackedWidget")); list = new QListWidget(this); //新建一个QListWidget对象 list->insertItem(0, tr("window1")); //插入三个条目 list->insertItem(1, tr("window2")); list->insertItem(2, tr("window3")); label1 = new QLabel(tr("windowTest1")); //新建三个标签对象,作为堆栈窗口需要显示的三层窗体 label2 = new QLabel(tr("windowTest2")); label3 = new QLabel(tr("windowTest3")); stack = new QStackedWidget(this); //新建一个堆栈窗体对象 stack->addWidget(label1); //将新建的三个QLabel标签控件依次插入堆栈窗体中 stack->addWidget(label2); stack->addWidget(label3); QHBoxLayout *mainLayout = new QHBoxLayout(this); //对整个对话框进行布局 mainLayout->setMargin(5); //设置对话框的边距为5 mainLayout->setSpacing(5); //设置各个控件之间的间距为5 mainLayout->addWidget(list); mainLayout->addWidget(stack,0,Qt::AlignHCenter); mainLayout->setStretchFactor(list, 1); //设置list为可伸缩控件 mainLayout->setStretchFactor(stack,3); connect(list,SIGNAL(currentRowChanged(int)),stack,SLOT(setCurrentIndex(int))); //将 QListWidget的currentRowChanged信号和堆栈窗体的setCurrentIndex槽函数连接起来,实现按选择显示窗体。 } StackDlg::~StackDlg() { }
多媒体
2018-09-02 21:21:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Qt之停靠窗口QDockWidget类
设置停靠窗口的一般流程
1、创建一个QDockWidget对象的停靠窗口
2、设置此停靠窗体的属性,通常调用setFeatures()以及setAllowAreas()两种方法
3、新建一个要插入停靠窗口的控件,常用的有QListWidget和QTextEdit
4、将控件插入停靠窗口,调用QDockWidget的setWidget()方法
5、使用addDockWidget方法在MainWindow中加入此停靠窗口
步骤:
1、新建Qt GUI应用,项目名称DockWindows,基类选择"QMainWindow",类名选择"DockWindows",取消"创建界面"
2、修改DockWindows.h,DockWindows.cpp文件,在构造函数中实现窗口的初始化以及功能实现
DockWindows.h #ifndef DOCKWINDOWS_H #define DOCKWINDOWS_H #include class DockWindows : public QMainWindow { Q_OBJECT public: explicit DockWindows(QWidget *parent = 0); ~DockWindows(); }; #endif // DOCKWINDOWS_H

DockWindows.cpp #include "dockwindows.h" #include "ui_dockwindows.h" #include #include DockWindows::DockWindows(QWidget *parent) : QMainWindow(parent) { setWindowTitle(tr("windows")); //设置主窗口的标题栏文字 QTextEdit *te = new QTextEdit(this); //定义一个QTextEdit对象作为主窗口 te->setText(tr("Main Window")); te->setAlignment(Qt::AlignCenter); setCentralWidget(te); //将此编辑框设为主窗口的中央窗体 //停靠窗口1 QDockWidget *dock = new QDockWidget(tr("DockWindow1"), this); dock->setFeatures(QDockWidget::DockWidgetMovable); //可移动 dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); //可以在主窗口的左/右边停靠 QTextEdit *te1 =new QTextEdit(); te1->setText(tr("Window1,The dock widget can be moved between docks by the user" "")); dock->setWidget(te1); addDockWidget(Qt::RightDockWidgetArea,dock); //停靠窗口2 dock=new QDockWidget(tr("DockWindow2"),this); dock->setFeatures(QDockWidget::DockWidgetClosable|QDockWidget::DockWidgetFloatable); //可关闭、可浮动 // QDockWidget::NoDockWidgetFeatures //不可以关闭,不可以移动,不可以浮动 dock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea); //顶端停靠,底部停靠 QTextEdit *te2 =new QTextEdit(); te2->setText(tr("Window2,The dock widget can be detached from the main window,""and floated as an independent window, and can be closed")); dock->setWidget(te2); addDockWidget(Qt::RightDockWidgetArea,dock); //停靠窗口3 dock=new QDockWidget(tr("DockWindow3"),this); dock->setFeatures(QDockWidget::AllDockWidgetFeatures); //全部特性 QTextEdit *te3 =new QTextEdit(); te3->setText(tr("Window3,The dock widget can be closed, moved, and floated")); dock->setWidget(te3); addDockWidget(Qt::RightDockWidgetArea,dock); } DockWindows::~DockWindows() { }

---
多媒体
2018-09-02 20:48:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
分隔窗口QSplitter类
* 1、新建QT GUI应用,项目名称为Splitter,基类选择QMainWindow,取消"创建界面"
* 2、修改main.cpp #include "mainwindow.h" #include #include #include #include // int main(int argc, char *argv[]) { QApplication a(argc, argv); QFont font("ZYSong18030", 12); a.setFont(font); //指定显示字体 QSplitter *splitterMain = new QSplitter(Qt::Horizontal, 0); //主分隔窗口,设定此分割窗口为水平分割窗口 QTextEdit * textLeft = new QTextEdit(QObject::tr("left widget"), splitterMain); //新建一个QTextEdit类,并将其插入主分割窗口中 textLeft->setAlignment(Qt::AlignAbsolute); //设定TextEdit中文字的对齐方式:文字居中 // Qt::AlignCenter,Qt::AlignLeft,Qt::AlignRight, //右部分割窗口 QSplitter *splitterRight =new QSplitter(Qt::Vertical,splitterMain); //垂直分割,并以主分割窗口为父窗口 splitterRight->setOpaqueResize(false); QTextEdit *textUp =new QTextEdit(QObject::tr("Top Widget"),splitterRight); textUp->setAlignment(Qt::AlignCenter); QTextEdit *textBottom =new QTextEdit(QObject::tr("Bottom Widget"),splitterRight); // textBottom->setAlignment(Qt::AlignCenter); splitterMain->setStretchFactor(1,0); //右边部分为可伸缩部件 splitterMain->setWindowTitle(QObject::tr("Splitter")); splitterMain->show(); return a.exec(); }
多媒体
2018-09-02 20:15:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
本文主要是下面这个链接的补充 https://blog.csdn.net/leixiaohua1020/article/details/39702113 avdevice_register_all (); avformat_network_init (); av_register_all (); AVFormatContext * pFormatCtx = avformat_alloc_context (); AVInputFormat *ifmt = av_find_input_format ( "dshow" ); av_register_input_format ( ifmt ); // 唯一区别,在我使用的3.3版本中,不加此句会获取失败 if (avformat_open_input ( &pFormatCtx, "video=Integrated Camera", ifmt, NULL ) != 0) { printf ( "Couldn't open input stream.\n" ); return -1; }
2. main函数进不去的解决办法: 在此过程中,碰到了include "SDL.h" 就会进不去main函数的问题,解决办法是在main函数之前加上 #undef main 。发生这种情况的原因是因为sdl这个lib中定义了main,而我们一般都是先声明头文件,这样编译器在寻找main的过程中,就会先在sdl中发现main这个关键字,最终就导致了每次我们启动程序,入口点就变成sdl定义的main函数。
欢迎在下方留言探讨
多媒体
2018-09-02 10:00:00
「深度学习福利」大神带你进阶工程师,立即查看>>> #include "mainwindow.h" #include #include using namespace cv; using namespace std; /* 名字: 颜色空间缩减函数 * 目的:减少图像中颜色的数量 * 方法: 比如原来有256中颜色,要将其变成64种颜色: * 将原来的颜色/4然后乘以4就可以了 */ /* 方法1:用指针访问像素,release时速度最快 0.0066653 */ void colorReducePtr(Mat &inputImage, Mat& outputImage, int div) { //参数准备 outputImage = inputImage.clone(); //复制实参到临时变量 int rowNumber = outputImage.rows; //行数 int colNumber = outputImage.cols * outputImage.channels(); //每一行元素的个数 = 类数 * 通道数 //双for,遍历所有像素值 for(int i = 0; i < rowNumber; ++i) //行 { uchar *data = outputImage.ptr(i); //获取第i行的首地址 for(int j = 0; j < colNumber; ++j) { data[j] = data[j]/div*div + div/2; // 处理每一个像素 cout << data[j] << ends; } } } void colorReducePtr2(Mat &inputImage, Mat& outputImage, int div) { //参数准备 outputImage = inputImage.clone(); //复制实参到临时变量 int rowNumber = outputImage.rows; //行数 int colNumber; if(outputImage.isContinuous()){ colNumber = outputImage.total() * outputImage.elemSize(); //每一行元素的个数 rowNumber = 1; uchar *data = outputImage.ptr(0); //获取第i行的首地址 for(int i = 0; i < colNumber; ++i){ data[i] = data[i]/div*div + div/2; } } } /* 0.242588 */ void colorReduceSTL(Mat &inputImage, Mat& outputImage, int div)//迭代器方式 { outputImage = inputImage.clone(); //复制实参到临时变量 Mat_::iterator it = outputImage.begin(); Mat_::iterator itEnd = outputImage.end(); for(; it!=itEnd ; it++){ //处理每一个像素 (*it)[0] = (*it)[0]/div *div + div/2; (*it)[1] = (*it)[1]/div *div + div/2; (*it)[2] = (*it)[2]/div *div + div/2; } } //At方式往往只用于随机分为某个位置上的像素值 void colorReduceAt(Mat& inputImage, Mat& outputImage, int div) { outputImage = inputImage.clone(); int rows = outputImage.rows; int cols = outputImage.cols; for(int i = 0;i < rows;i++) { for(int j = 0;j < cols;j++) { outputImage.at(i,j)[0] = outputImage.at(i,j)[0]/div*div + div/2; outputImage.at(i,j)[1] = outputImage.at(i,j)[1]/div*div + div/2; outputImage.at(i,j)[2] = outputImage.at(i,j)[2]/div*div + div/2; } } } int main(int argc, char *argv[]) { QApplication a(argc, argv); Mat srcImage = imread("F:\\MyCode\\dcq.jpg"); imshow("srcImage", srcImage); //按照原始图的参数规格来创建效果图 Mat dstImage ; dstImage.create(srcImage.rows, srcImage.cols, srcImage.type()); //记录起始时间 double time0 = static_cast(getTickCount()); //调用颜色空间缩减函数 colorReduceAt(srcImage, dstImage, 64); time0 = ((double)getTickCount() - time0) / getTickFrequency(); cout << "time: " << time0 << "[s]" << endl; //消耗的时间 imshow("dstImage", dstImage); return a.exec(); }
多媒体
2018-08-31 19:13:00
「深度学习福利」大神带你进阶工程师,立即查看>>> Mat temImage; cv::resize(curImage, temImage, Size(curImage.cols*2, curImage.rows*2), INTER_LINEAR); curImage = temImage.clone(); displayMat(curImage); // qreal width = curPix.width() * 2; // // qreal height = curPix.height() * 2; // curPix = curPix.scaled(width, height,Qt::KeepAspectRatio); // ui->label->setPixmap(curPix); //消耗CPU // ui->label->resize(ui->label->pixmap()->size()); //设置img大小, // ui->label->show();
--
多媒体
2018-08-31 16:21:00
「深度学习福利」大神带你进阶工程师,立即查看>>> #include "mainwindow.h" #include #include #include /* 总结:Rect与Point等都只能是int类型,如果是是float,会自动转换成整形 */ int main(int argc, char *argv[]) { QApplication a(argc, argv); QListRectList; float x = 10.33; float y = 10.0; float w = 300.123; float h = 300.45; Rect rect(x, y, w, h); qDebug() << rect.width << rect.height; //300 300 Point point(x, y); qDebug() << point.x << point.y; //10 10 RectList.push_back(rect); for(auto it = RectList.begin(); it != RectList.end(); ++it) { (*it).x = (*it).x * 2; (*it).y = (*it).y / 2; qDebug() <<(*it).x ; } qDebug() << RectList.back().x << RectList.back().y << RectList.back().width << RectList.back().height; waitKey(); return a.exec(); }
多媒体
2018-08-31 14:48:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
https://blog.csdn.net/nicewe/article/details/79288600
多媒体
2018-08-31 12:55:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
《延禧攻略》自开播以来凭借画面的高级与构图的唯美刷新了影视审美的新高度,这部剧的整体配色非常高级,布景精致,给人一种舒服安宁的感觉,视觉效果清雅,文化底蕴深厚。我们来学下剧中的高级色彩与配图
(一) 色彩采用莫兰迪色系俗称“高级灰”,特点就是低饱和度和高级灰调,有很强的视觉质感,给人一种高贵沉稳,舒缓雅致的感觉。
(二)另一个画面唯美的因素是构图,构图的重要性:突出主体、吸引视线、简化杂乱、给出均衡和谐画面的作用。好的构图将会凸显画面的中心,使画面更具故事性,剧中主要用到下面几种构图法。

(1)中心构图法:将主体放置在画面中心。最大的优点在于主体突出、明确、而且画面容易取得平衡的效果。

(2)对称构图法:按照一定的对称轴或对称中心,使画面中的景物形成轴对称或者中心对称,常用于建筑隧道等。

(3)三分构图法:三分构图法也称井字构图法,是一种经常用的构图方法。场景用2条竖线和2条横线分隔,可得4个交叉点,将画面重点放置在4个交叉点的一个即可。

(4)框架构图法:顾名思义画面上需要有“框架”,但框架有2个意思:一个是无形的框,但是能够通过我们的视觉延伸,从而形成框架;另一个是有形的框,就是自然环境或我们生活中的各种框架。框架构图能把观众的视线引向框架内的景物,突出主体,同时有助于将主体与背景融为一体,赋予画面更大的视觉冲击。

(5)引导线构图法:利用线条引导观者的目光,使之汇集到画面的焦点。引导线不一定是具体的线,但凡有方向的、连续的东西都可以称为引导线。现实中道路、河流、颜色、阴影、甚至人的目光都可以当做引导线。这样的构图能够让观众的视觉聚焦于一点,同时使画面具有一定的视觉冲击。

(6)对角线构图:是指主体沿对角线方向排列,旨在表现出动感、不稳定性与生命力等感觉,画面更加舒展、饱满、视觉体验更强。

(7)设置前景:设置一个前景,使前景模糊,让主体更加突出,也让画面更有层次和艺术感。
多媒体
2018-08-31 11:13:00
「深度学习福利」大神带你进阶工程师,立即查看>>> Mat tempCurImage = curImage; //浅拷贝,指向同一块内存,因此如果temp变了curImage也变 // Mat tempCurImage = curImage.clone(); //深拷贝,两份内存,操作不关联 rectangle(tempCurImage,Point(startPos.x(), startPos.y()), ////确定左上角坐标 Point(endPos.x(),endPos.y()),//确定右下角坐标 Scalar(0x00,0xff,0xff) //线条白色 ); displayMat(tempCurImage);

结构:可以画多个正方形,但是一个矩形会记录所有矩形,可以同时放大缩小图像 Mat tempCurImage = curImage.clone(); //深拷贝,共享数据区,操作不关联 rectangle(tempCurImage,Point(startPos.x(), startPos.y()), ////确定左上角坐标 Point(endPos.x(),endPos.y()),//确定右下角坐标 Scalar(0x00,0xff,0xff) //线条白色 ); displayMat(tempCurImage);

结构:只能画一个矩形,矩形是干净的,可以同时放大缩小图像

----
多媒体
2018-08-31 11:00:06
「深度学习福利」大神带你进阶工程师,立即查看>>>
1、添加Item类
sation.h #ifndef SATION_H #define SATION_H #include /*新实现一个sation类,这个类可以在scene中用,也可以在mainwindow中用*/ class Sation : public QGraphicsItem { public: Sation(qreal, qreal); void paint(QPainter*, // // paint虚函数:绘制图标 const QStyleOptionGraphicsItem*, QWidget* ); QRectF boundingRect() const{ // boundingRect虚函数:定义每个图标对应的外部边框 return QRectF(-6.5, -13, 13, 18);//返回一个矩形:比我们要画的图标稍大 } }; #endif // SATION_H
sation.cpp #include "sation.h" #include Sation::Sation(qreal x, qreal y):QGraphicsItem() { setPos(x, y); setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIgnoresTransformations ); } //构造函数里我们根据x和y传递的参数设置坐标。在paint函数绘制我们的电台图标。 void Sation::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { //绘制电台图标,必须小于边框矩形 painter->setRenderHint( QPainter::Antialiasing ); painter->setPen( QPen( Qt::black, 2 ) ); painter->drawRect( -4, -3, 8, 7 ); //画一个矩形:以鼠标点击的位置作为起始中心 painter->drawLine( 0, -4, 0, -11 ); painter->drawLine( -5, -11, 0, -6 ); painter->drawLine( +5, -11, 0, -6 ); }
2、在scene类中处理item类
scene.h #ifndef SCENE_H #define SCENE_H class QGraphicsSceneMouseEvent; #include #include "sation.h" class Scene : public QGraphicsScene { Q_OBJECT public: Scene( ); // constructor signals: void message( QString ); // 文本消息信号 protected: void mousePressEvent( QGraphicsSceneMouseEvent* ); // 接收鼠标按下事件 void contextMenuEvent( QGraphicsSceneContextMenuEvent* ); // 接收上下文菜单事件 }; #endif // SCENE_H
scene.cpp #include "scene.h" #include #include #include #include Scene::Scene( ) : QGraphicsScene() { addLine( 0, 0, 0, 1, QPen(Qt::transparent, 1) ); } void Scene::mousePressEvent( QGraphicsSceneMouseEvent* event ) { // 设置本地变量和检查被选中的电台是否存在 qreal x = event->scenePos().x(); qreal y = event->scenePos().y(); QTransform transform; Sation *station = dynamic_cast(this->itemAt(QPointF(x, y), transform)); //pointf返回一个基类,现在让他指向派生类 // 如果电台没有被选中并且鼠标左键被按下, 创建一个新电台 if ( station == 0 && event->button() == Qt::LeftButton ) { addItem( new Sation( x, y ) ); emit message( QString("Station add at %1,%2").arg(x).arg(y) ); } // 调用基类的mousePressEvent处理其它鼠标按下事件 QGraphicsScene::mousePressEvent( event ); } /* * 添加新方法contextMenuEvent的代码。当用户在场景里按下鼠标右键,这个方法将被调用。我们只想用户指向一个电台时才会显示一个上下文菜单。 * 然后我们创建一个只有删除电台选项的菜单。 * 如果用户选择这个选项,电台将会从场景中删除,并且从内存中删除,和发送一条消息。 */ void Scene::contextMenuEvent( QGraphicsSceneContextMenuEvent* event ) { // 我们只想当用户选择一个电台时才显示菜单 qreal x = event->scenePos().x(); qreal y = event->scenePos().y(); QTransform transform; Sation *station = dynamic_cast(this->itemAt(QPointF(x, y), transform)); //pointf返回一个基类,现在让他指向派生类 if(0 == station) return; // 显示上下文和相应的动作 QMenu menu; QAction* deleteAction = menu.addAction("Delete Station"); if ( menu.exec( event->screenPos() ) == deleteAction ) { removeItem( station ); delete station; emit message( QString("Station deleted at %1,%2").arg(x).arg(y) ); } }
3、将scene放入view
mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include "scene.h" class Scene; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); private: Scene* m_scene; public slots: //添加槽方法的定义 void showMessage( QString ); // 在状态栏上显示消息 }; #endif // MAINWINDOW_H
mainwindow.cpp #include "mainwindow.h" #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { menuBar()->addMenu( "&File" ); menuBar()->addMenu( "&Edit" ); menuBar()->addMenu( "&View" ); menuBar()->addMenu( "&Simulate" ); menuBar()->addMenu( "&Help" ); statusBar()->showMessage("QSimulate has started"); // 创建场景和显示场景的中央视图部件 m_scene = new Scene(); //View是视图,负责显示;Scene是文档,负责存储数据。所以从这个角度出发,我们可以这样认为,一个Scene可以关联到多个View,就好比一份数据可以有多个视图去查看它一样。 QGraphicsView* view = new QGraphicsView( m_scene ); //QGraphicsScene是一个视图,它不能够单独存在,必须关联到至少一个QGraphicsView view->setAlignment( Qt::AlignLeft | Qt::AlignTop ); view->setFrameStyle( 0 ); setCentralWidget( view ); //将信号与槽关联:m_scene发射message信号时,MainWindow接收信号,执行showMessage槽函数 connect( m_scene, SIGNAL(message(QString)), this, SLOT(showMessage(QString)) ); } MainWindow::~MainWindow() { } void MainWindow::showMessage( QString msg ) { statusBar()->showMessage( msg ); // 在主窗口状态栏上显示消息 }
4、main.cpp #include "mainwindow.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
多媒体
2018-09-04 11:45:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
https://blog.csdn.net/elf001/article/details/8978528
1、知识点:
/* Item则是具体要显示的东西。最基本的Qt类就是QGraphicsItem,一般如果要显示自定义的形状通常的
* 做法是继承自QGraphicsItem,然后去实现它的两个纯虚函数boundingRect和paint
* virtual QRectF boundingRect () const = 0
* virtual void paint ( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 ) = 0
* boundingRect就是返回该Item的包围盒,用于Graphics内部的碰撞检测以及选取等计算。paint则是用于Item的重绘。
*/
2、实现一个item类:
2.1、Sation.h #ifndef SATION_H #define SATION_H #include /*新实现一个sation类,这个类可以在scene中用,也可以在mainwindow中用*/ class Sation : public QGraphicsItem { public: Sation(qreal, qreal); void paint(QPainter*, // // paint虚函数:绘制图标 const QStyleOptionGraphicsItem*, QWidget* ); QRectF boundingRect() const{ // boundingRect虚函数:定义每个图标对应的外部边框 return QRectF(-6.5, -13, 13, 18);//返回一个矩形:比我们要画的图标稍大 } }; #endif // SATION_H
2.2、sation.cpp #include "sation.h" #include Sation::Sation(qreal x, qreal y):QGraphicsItem() { setPos(x, y); } //构造函数里我们根据x和y传递的参数设置坐标。在paint函数绘制我们的电台图标。 void Sation::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { //绘制电台图标,必须小于边框矩形 painter->setRenderHint( QPainter::Antialiasing ); painter->setPen( QPen( Qt::black, 2 ) ); painter->drawRect( -4, -3, 8, 7 ); painter->drawLine( 0, -4, 0, -11 ); painter->drawLine( -5, -11, 0, -6 ); painter->drawLine( +5, -11, 0, -6 ); }

3、在场景类中:
3.1、scene.h #ifndef SCENE_H #define SCENE_H class QGraphicsSceneMouseEvent; #include #include "sation.h" class Scene : public QGraphicsScene { Q_OBJECT public: Scene( ); // constructor signals: void message( QString ); // 文本消息信号 protected: void mousePressEvent( QGraphicsSceneMouseEvent* ); // 接收鼠标按下事件 }; #endif // SCENE_H
3.2、scene.cpp #include "scene.h" #include Scene::Scene( ) : QGraphicsScene() { addLine( 0, 0, 0, 1, QPen(Qt::transparent, 1) ); /*在构造函数里我们需要在(0,0)处添加一个不可见的项作为场景的初始锚。 * 如里没有这样做,Qt默认会把用户添加第一个电台作为左上角定位的锚, * 后面添加的电台位置并不是用户所想的。*/ } void Scene::mousePressEvent( QGraphicsSceneMouseEvent* event ) { // 判断用户是否按下鼠标左键 if ( event->button() != Qt::LeftButton ) return; // 发送信息信号 qreal x = event->scenePos().x(); qreal y = event->scenePos().y(); addItem(new Sation(x, y)); // 在用户点击场景的位置新建一个电台 emit message( QString("Clicked at %1,%2").arg(x).arg(y) ); }
这里是在scene中的鼠标点击位置的x,y用来构造一个sation,也就是将此时左键鼠标点击的x,y作为一个传参初始化一个item,作为sation的的作图坐标原点,画矩形和线
3、mainwindow中:设置view管理scene
3.1、mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include "scene.h" class Scene; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); private: Scene* m_scene; public slots: //添加槽方法的定义 void showMessage( QString ); // 在状态栏上显示消息 }; #endif // MAINWINDOW_H
3.2、mainwindows.cpp中 #include "mainwindow.h" #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { menuBar()->addMenu( "&File" ); menuBar()->addMenu( "&Edit" ); menuBar()->addMenu( "&View" ); menuBar()->addMenu( "&Simulate" ); menuBar()->addMenu( "&Help" ); statusBar()->showMessage("QSimulate has started"); // 创建场景和显示场景的中央视图部件 m_scene = new Scene(); //View是视图,负责显示;Scene是文档,负责存储数据。所以从这个角度出发,我们可以这样认为,一个Scene可以关联到多个View,就好比一份数据可以有多个视图去查看它一样。 QGraphicsView* view = new QGraphicsView( m_scene ); //QGraphicsScene是一个视图,它不能够单独存在,必须关联到至少一个QGraphicsView view->setAlignment( Qt::AlignLeft | Qt::AlignTop ); view->setFrameStyle( 0 ); setCentralWidget( view ); //将信号与槽关联:m_scene发射message信号时,MainWindow接收信号,执行showMessage槽函数 connect( m_scene, SIGNAL(message(QString)), this, SLOT(showMessage(QString)) ); } MainWindow::~MainWindow() { } void MainWindow::showMessage( QString msg ) { statusBar()->showMessage( msg ); // 在主窗口状态栏上显示消息 }

多媒体
2018-09-04 10:14:00