2017-03-08 31 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 –

相關問題