如何使用 QPainter 在 QMainWindow 中的一组小部件中的特定小部件上进行绘制? [英] How to draw with QPainter on a specific widget from a group of widgets in QMainWindow?

查看:240
本文介绍了如何使用 QPainter 在 QMainWindow 中的一组小部件中的特定小部件上进行绘制?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的代码:

#include "mainwindow.h"#include #include #include #include <fstream>#include MainWindow::MainWindow(QWidget *parent): QMainWindow(父){m_QPushButton_calibration = new QPushButton("Calibrate", this);连接(m_QPushButton_calibration,信号(释放()),这个,插槽(handleButton()));QListl_QListQCameraInfo_available_cameras = QCameraInfo::availableCameras();m_QWidget_viewfinder_holder = 新的 QWidget;m_QWidget_viewfinder_holder->setStyleSheet("background-color: black");m_QCameraViewfinder_viewfinder = new QCameraViewfinder(m_QWidget_viewfinder_holder);如果(l_QListQCameraInfo_available_cameras.length()> = 2){m_QCamera_required_camera = 新的 QCamera (l_QListQCameraInfo_available_cameras[1]);m_QCamera_required_camera->setViewfinder(m_QCameraViewfinder_viewfinder);m_QCamera_required_camera->start();}m_QWidget_central = 新的 QWidget;m_QGridLayout_central = 新的 QGridLayout;m_QWidget_central->setLayout (m_QGridLayout_central);m_QGridLayout_central->addWidget(m_QPushButton_calibration, 0, 0, 1, 1);m_QGridLayout_central->addWidget (m_QWidget_viewfinder_holder, 1, 0, 1, 1);this->setCentralWidget (m_QWidget_central);m_QCameraViewfinder_viewfinder->show();}void MainWindow::paintEvent(QPaintEvent *){QPainter 画家(this);Painter.setPen(Qt::white);Painter.setFont(QFont("Arial", 30));Painter.drawText(rect(), Qt::AlignCenter, "Qt");}主窗口::~主窗口(){删除 m_QPushButton_calibration;删除 m_QCameraViewfinder_viewfinder;删除 m_QCamera_required_camera;删除 m_QGridLayout_central;删除 m_QWidget_central;}void MainWindow::handleButton(){qDebug() <<"手柄按钮";}

我实际上希望在 m_QWidget_viewfinder_holder 小部件上画一条线.

  1. QPaintEvent 函数如何知道我希望它在哪里画线?

  2. 我可以在继承自 QMainWindow 的类中使用 QPaintEvent 作为成员函数吗?

解决方案

如何使用 QPainter 在 QMainWindow 中的一组小部件中的特定小部件上进行绘制?

您不能在另一个小部件的小部件上绘图.每个小部件负责在 paintEvent() 函数中绘制自己的表面.


<块引用>

QPaintEvent 函数如何知道我希望它在哪里画线?

首先,请注意 QPaintEvent 是一个类,而不是一个函数.

现在您可能想谈谈 paintEvent() 函数.函数知道"在哪里绘制,因为它是小部件的一部分,并且小部件具有几何形状.

例如,如果我想创建一个 Rectangle 小部件来绘制一个边距为 5px 的矩形,我会这样写:

void Rectangle::paintEvent(QPaintEvent * e){QRect矩形(5, 5, width() - 5, height() - 5);QPainter 画家(this);Painter.drawRect(矩形);}


<块引用>

我可以在继承自 QMainWindow 的类中使用 QPaintEvent 作为成员函数吗?

您可以在继承 QWidget 的任何类中重新实现 paintEvent() 成员函数.如果你从一个已经绘制了一些东西的类继承,你需要调用你的父类函数.

void MainWindow::paintEvent(QPaintEvent *event){QMainWindow::paintEvent(事件);//让 QMainWindow 自己绘制QPainter 画家(this);Painter.setPen(Qt::white);Painter.setFont(QFont("Arial", 30));Painter.drawText(rect(), Qt::AlignCenter, "Qt");}

但是,请注意,您不太可能愿意重新实现 MainWindow 的 painteEvent().您通常想要做的是向 MainWindow 添加一个子小部件.


<块引用>

我实际上希望在 m_QWidget_viewfinder_holder 小部件上画一条线.

像这样创建一个 ViewFinderHolder 类:

class ViewFinderHolder: public QWidget {Q_OBJECT上市:显式取景器(QWidget *parent = 0)...}重新实现paintEvent()函数:类 ViewFinderHolder:公共 QWidget {Q_OBJECT上市:显式 ViewFinderHolder(QWidget *parent = 0)...受保护:voidpaintEvent(QPaintEvent *e);}void ViewFinderHolder::paintEvent(QPaintEvent *event){QLineF 线(10.0, 80.0, 90.0, 20.0);QPainter(this);Painter.drawLine(line);}

最后在 MainWindow 构造函数中替换:

m_QWidget_viewfinder_holder = 新的 QWidget;

作者:

m_QWidget_viewfinder_holder = new ViewFinder();

但是,由于 m_QCameraViewfinder_viewfinderm_QWidget_viewfinder_holder 的子项,它将被绘制在它上面并且可能隐藏您在 ViewFinderHolder::paintEvent() 中所做的绘制.


附带说明,您可以删除 MainWindow 析构函数中的删除语句.删除 MainWidow 的实例将删除其子小部件.

This is my code:

#include "mainwindow.h"
#include <QDebug>

#include <QCameraInfo>
#include <QHBoxLayout>
#include <fstream>
#include <assert.h>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    m_QPushButton_calibration = new QPushButton("Calibrate", this);
    connect(m_QPushButton_calibration, SIGNAL (released()),this, SLOT (handleButton()));

    QList<QCameraInfo> l_QListQCameraInfo_available_cameras = QCameraInfo::availableCameras();

    m_QWidget_viewfinder_holder    = new QWidget;
    m_QWidget_viewfinder_holder->setStyleSheet ("background-color: black");

    m_QCameraViewfinder_viewfinder = new QCameraViewfinder(m_QWidget_viewfinder_holder);

    if (l_QListQCameraInfo_available_cameras.length() >= 2)
    {
        m_QCamera_required_camera = new QCamera (l_QListQCameraInfo_available_cameras[1]);

        m_QCamera_required_camera->setViewfinder(m_QCameraViewfinder_viewfinder);
        m_QCamera_required_camera->start ();
    }

    m_QWidget_central     = new QWidget;
    m_QGridLayout_central = new QGridLayout;

    m_QWidget_central->setLayout (m_QGridLayout_central);

    m_QGridLayout_central->addWidget (m_QPushButton_calibration, 0, 0, 1, 1);
    m_QGridLayout_central->addWidget (m_QWidget_viewfinder_holder, 1, 0, 1, 1);

    this->setCentralWidget (m_QWidget_central);

    m_QCameraViewfinder_viewfinder->show();
}

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setPen(Qt::white);
    painter.setFont(QFont("Arial", 30));
    painter.drawText(rect(), Qt::AlignCenter, "Qt");
}

MainWindow::~MainWindow()
{
    delete m_QPushButton_calibration;
    delete m_QCameraViewfinder_viewfinder;
    delete m_QCamera_required_camera;
    delete m_QGridLayout_central;
    delete m_QWidget_central;
}

void MainWindow::handleButton()
{
    qDebug() << "handleButton";
}

I actually wish to draw a line on m_QWidget_viewfinder_holder widget.

  1. How will that QPaintEvent function know where do I want it to draw line?

  2. Can I use QPaintEvent as a member function in a class inherited from QMainWindow?

解决方案

How to draw with QPainter on a specific widget from a group of widgets in QMainWindow?

You cannot draw on a widget from another widget. Each widget is responsible for drawing its own surface in the paintEvent() function.


How will that QPaintEvent function know where do I want it to draw line?

First, note that QPaintEvent is a class, not a function.

Now you probably want to talk about the paintEvent() function. The function "knows" where to draw because it is part of a widget and the widget has a geometry.

For instance if I want to create a Rectangle widget that draws a rectangle with a 5px margin, I would write something like:

void Rectangle::paintEvent(QPaintEvent * e)
{
    QRect rectangle(5, 5, width() - 5, height() - 5);

    QPainter painter(this);
    painter.drawRect(rectangle);
}


Can I use QPaintEvent as a member function in a class inherited from QMainWindow?

You can reimplement the paintEvent() member function in any class that inherits QWidget. If you inherits from a class that already draws something you need to call your parent class function.

void MainWindow::paintEvent(QPaintEvent *event)
{
    QMainWindow::paintEvent(event); // Let QMainWindow draw itself
    QPainter painter(this);
    painter.setPen(Qt::white);
    painter.setFont(QFont("Arial", 30));
    painter.drawText(rect(), Qt::AlignCenter, "Qt");
}

However, please note that you are not likely willing to reimplement the painteEvent() of a MainWindow. What you generally want to do is to add a child widget to the MainWindow.


I actually wish to draw a line on m_QWidget_viewfinder_holder widget.

Create a ViewFinderHolder class like so:

class ViewFinderHolder: public QWidget {
    Q_OBJECT
    public:
        explicit ViewFinder(QWidget *parent = 0)
    ...
}

Reimplement the paintEvent() function:


class ViewFinderHolder: public QWidget {
    Q_OBJECT
    public:
        explicit ViewFinderHolder(QWidget *parent = 0)
    ...
    protected:
        void paintEvent(QPaintEvent *e);
}

void ViewFinderHolder::paintEvent(QPaintEvent *event)
{
    QLineF line(10.0, 80.0, 90.0, 20.0);

    QPainter(this);
    painter.drawLine(line);
}

Finally in the MainWindow constructor replace:

m_QWidget_viewfinder_holder    = new QWidget;

by:

m_QWidget_viewfinder_holder    = new ViewFinder();

However, as m_QCameraViewfinder_viewfinder is a child of m_QWidget_viewfinder_holder, it will be drawn over it and may hide the drawing you did in ViewFinderHolder::paintEvent().


On a side note, you can remove the delete statements in the destructor of MainWindow. Deleting an instance of MainWidow will delete its child widgets.

这篇关于如何使用 QPainter 在 QMainWindow 中的一组小部件中的特定小部件上进行绘制?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆