需求
窗口变化时,窗口中的矩形框也变化。
效果展示
当窗口变大时其矩形框也变大
要求绿色矩形框与蓝色背景的边距始终为10。
代码
直接上项目的代码。
项目结构
各文件的代码
main.cpp
#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
protected:
void initScene();
void resizeEvent(QResizeEvent *event);
public slots:
private:
Ui::Dialog *ui;
QGraphicsScene *m_scene;
QGraphicsRectItem *m_item;
};
#endif
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
ui->setupUi(this);
setWindowFlags(Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint);
initScene();
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::initScene()
{
m_scene = new QGraphicsScene(this);
QRect sizeView = ui->graphicsView->geometry();
qDebug()<<"视图大小:"<<sizeView;
qDebug()<<"窗口大小"<<size();
m_scene->setSceneRect(0,0,size().width(),size().height());
m_scene->setBackgroundBrush(Qt::darkBlue);
ui->graphicsView->setScene(m_scene);
qDebug()<<"场景的矩形:"<<m_scene->sceneRect();
QRectF rect(m_scene->sceneRect().x() + 10,m_scene->sceneRect().y() + 10,m_scene->sceneRect().width() - 20,m_scene->sceneRect().height() - 20);
m_item = new QGraphicsRectItem(rect);
QPen pen(Qt::DashDotLine);
pen.setWidth(3);
pen.setColor(Qt::green);
m_item->setPen(pen);
m_scene->addItem(m_item);
}
void Dialog::resizeEvent(QResizeEvent *event)
{
qDebug()<<"窗口大小"<<size();
m_scene->setSceneRect(0,0,size().width(),size().height());
qDebug()<<"场景的矩形:"<<m_scene->sceneRect();
QRectF rect(m_scene->sceneRect().x() + 10,m_scene->sceneRect().y() + 10,m_scene->sceneRect().width() - 20,m_scene->sceneRect().height() - 20);
m_item->setRect(rect);
}
dialog.ui
其文件的类对象如下:
以上是整个程序。但是当窗口最大化后,场景和视图都变大,若是不重新设置场景的场景矩形,则绿色矩形框的大小和位置保持不变,即将代码改为如下,注释掉其中设置场景大小的代码。
void Dialog::resizeEvent(QResizeEvent *event)
{
qDebug()<<"窗口大小"<<size();
qDebug()<<"场景的矩形:"<<m_scene->sceneRect();
QRectF rect(m_scene->sceneRect().x() + 10,m_scene->sceneRect().y() + 10,m_scene->sceneRect().width() - 20,m_scene->sceneRect().height() - 20);
m_item->setRect(rect);
}
这样修改后,表面上可以讲通,窗口变化获取场景矩形,然后重新设置绿色矩形框的位置大小。但实际绿色矩形框的大小并未变化,究其原因是获取的场景矩形的大小没有变化。需重新设置场景矩形后,绿色矩形框的大小才可以随窗口变化而变化。求解答。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)