这是我的代码:
#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
小部件上画一条线。
QPaintEvent
函数如何知道我希望它在哪里画线?
我可以在QPaintEvent
继承的类中使用QMainWindow
作为成员函数吗?
答案 0 :(得分:4)
如何在QMainWindow中的一组小部件的特定小部件上使用QPainter进行绘制?
您无法在其他窗口小部件上绘制窗口小部件。每个小部件都负责在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);
}
我可以在从QMainWindow继承的类中使用QPaintEvent作为成员函数吗?
您可以在继承paintEvent()
的任何类中重新实现QWidget
成员函数。如果你继承了一个已经绘制了你需要调用父类函数的类。
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小部件上画一条线。
像这样创建一个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_viewfinder
是m_QWidget_viewfinder_holder
的孩子,因此会将其绘制在ViewFinderHolder::paintEvent()
上并隐藏您在js
中所做的绘图。
在旁注中,您可以删除MainWindow的析构函数中的delete语句。删除MainWidow实例将删除其子窗口小部件。