如何从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继承的类中的成员函数吗?

如何从qmainwindow中的一组小部件上使用qpainter绘制qpainter?

您无法从另一个小部件绘制小部件。每个小部件负责在paintEvent()函数中绘制自己的表面。


该qpaintevent函数将如何知道我要在哪里绘制线?

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

现在您可能想谈论paintEvent()功能。该功能"知道"在哪里绘制,因为它是小部件的一部分,而小部件具有几何形状。

例如,如果我想创建一个用5px边距绘制矩形的Rectangle小部件,我会写下类似的内容:

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

但是,请注意,您不太愿意重新实现MainWindow的painteEvent()。您通常想做的是在MainWindow中添加一个孩子小部件。


我实际上希望在m_qwidget_viewfinder_holder widget上绘制一条线。

创建一个ViewFinderHolder类,这样:

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

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

m_QWidget_viewfinder_holder    = new QWidget;

m_QWidget_viewfinder_holder    = new ViewFinder();

但是,由于m_QCameraViewfinder_viewfinderm_QWidget_viewfinder_holder的孩子,它将在它上绘制,并可能隐藏您在ViewFinderHolder::paintEvent()中所做的图纸。


在旁注上,您可以删除MainWindow灾难中的删除语句。删除MainWidow实例将删除其子小部件。

相关内容

  • 没有找到相关文章

最新更新