2017-03-08 211 views
0

这是我的代码:如何从QMainWindow中的一组控件中的特定控件上绘制QPainter?

#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"; 
} 

我其实是想借鉴m_QWidget_viewfinder_holder插件线。

  1. 这将如何QPaintEvent功能知道我需要它来画线?

  2. 我可以使用QPaintEvent为成员函数从QMainWindow继承的类?

回答

2

如何与QPainter的借鉴,从一组中的QMainWindow部件的特定部件?

您无法从其他小部件上绘制小部件。每个小部件负责在paintEvent()函数中绘制自己的曲面。


这将如何QPaintEvent功能知道我需要它来画线?

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

现在你可能想谈谈paintEvent()函数。 函数“知道”在哪里绘制,因为它是一个小部件的一部分,并且该小部件具有一个几何图形。

举例来说,如果我想创建一个Rectangle小工具,绘制一个矩形有5px的保证金,我会写这样的:

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

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

我可以使用QPaintEvent作为一个成员函数一个从QMainWindow继承的类?

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

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"); 
} 

但是,请注意,您可能不会愿意重新实现一个主窗口的painteEvent()。你通常想要做的是将一个子部件添加到MainWindow中。


我其实是想借鉴m_QWidget_viewfinder_holder插件线。在主窗口的构造

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); 
} 

最后取代:

创建ViewFinderHolder类,像这样

m_QWidget_viewfinder_holder = new QWidget; 

由:

m_QWidget_viewfinder_holder = new ViewFinder(); 

然而,由于m_QCameraViewfinder_viewfinder是孩子m_QWidget_viewfinder_holder,它将被绘制在它上面,并可能隐藏你在ViewFinderHolder::paintEvent()中所做的绘图。


在附注上,您可以删除MainWindow的析构函数中的删除语句。删除MainWidow的一个实例将删除它的子窗口小部件。

+0

感谢您的详细解答。顺便说一下,关于析构函数 - 不是它应该做什么?摧毁一切?那么应该在哪里销毁呢? –

+0

@AquariusTheGirl一般你是对的。但是当使用QObject类,比如QWidget时,删除一个对象将会删除每个子对象。这是在'〜QObject()'中处理的。所以删除他们自己不会伤害,但也不是必需的。请参阅http://doc.qt.io/qt-5/qobject.html#dtor.QObject和http://doc.qt.io/qt-5/objecttrees.html –

相关问题