Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 单击按钮,在QFrame中绘制。_C++_Qt_Drawing_Qpainter - Fatal编程技术网

C++ 单击按钮,在QFrame中绘制。

C++ 单击按钮,在QFrame中绘制。,c++,qt,drawing,qpainter,C++,Qt,Drawing,Qpainter,假设有一个名为“Draw”的QPushButton、一个QLineEdit和一个QFrame。单击按钮后,我想从QLineEdit中获取一个数字,并在QFrame中绘制一个圆。我该怎么做?请给我提供代码 另外,问题是应该在drawEvent方法中调用QPaint的draw方法。您不能直接在框架上绘制。 从这里开始,它一开始看起来很复杂,但当您第一次遇到它时,GUI程序是一个巨大的飞跃 在大多数GUI(Qt、OpenGL等)中,您建立了一个要在程序中绘制的元素列表,并以某种方式存储它们-然后有一个

假设有一个名为“Draw”的QPushButton、一个QLineEdit和一个QFrame。单击按钮后,我想从QLineEdit中获取一个数字,并在QFrame中绘制一个圆。我该怎么做?请给我提供代码


另外,问题是应该在drawEvent方法中调用QPaint的draw方法。

您不能直接在框架上绘制。
从这里开始,它一开始看起来很复杂,但当您第一次遇到它时,GUI程序是一个巨大的飞跃

在大多数GUI(Qt、OpenGL等)中,您建立了一个要在程序中绘制的元素列表,并以某种方式存储它们-然后有一个draw()函数,当计算机需要绘制图片时会调用它-例如,当它被移动或在它前面移动另一个窗口时。然后调用OnDraw或OnRepaint etc函数,您必须绘制对象列表


另一种方法是将它们全部绘制到一个图像(QOimage或QPixmap)上,并将其复制到OnDraw或OnRepaint中的屏幕上-例如,您可以对图形包执行此操作。

如果您希望您的帧进行绘制,则需要一种方法来知道它应该绘制什么,因此创建一个接收通知的插槽:

/* slot */ void drawCircle(QPoint origin, int radius) {
    addCircle(origin, radius);
    update(); // update the UI
}

void addCircle(QPoint origin, int radius) {
    circleList.add(new Circle(origin,radius));
}
然后,需要覆盖框架子类
paintEvent()
,以绘制圆:

void paintEvent(QPaintEvent *event) {
    QFrame::paintEvent(event);
    QPainter painter(this);
    foreach (Circle c, circleList) { // understand foreach requirements
        painter.drawEllipse(c.origin(), c.radius(), c.radius());
    }
}
只要响应按钮的
单击()
信号的插槽发出一个信号,用正确的参数调用
drawCircle
插槽,一切都应该正常工作。

如果对您来说还不够,那么这里有一个与您描述的匹配的简单设置的完整解决方案。在Linux上使用Qt4.5.2进行测试。我有一些空闲时间…;)

main.cpp:

#include <QApplication>
#include "window.h"

int main( int argc, char** argv )
{
    QApplication qapp( argc, argv );

    Window w;
    w.show();

    return qapp.exec();
}
#包括
#包括“window.h”
int main(int argc,字符**argv)
{
qapp应用程序qapp(argc、argv);
窗口w;
w、 show();
返回qapp.exec();
}
窗户

#pragma once

class QLineEdit;
class QPushButton;
#include <QWidget>

class Frame;

class Window : public QWidget
{
Q_OBJECT

public:
    Window();

private slots:
    void onButtonClicked();

private:
    QLineEdit*   m_lineEdit;
    QPushButton* m_pushButton;
    Frame*       m_frame;
};
#pragma一次
类QLineEdit;
类按钮;
#包括
类框架;
类窗口:公共QWidget
{
Q_对象
公众:
窗口();
专用插槽:
void onButtonClicked();
私人:
QLineEdit*m_lineEdit;
QPushButton*m_按钮;
帧*m_帧;
};
window.cpp:

#include <QHBoxLayout>
#include <QLineEdit>
#include <QPushButton>
#include <QVBoxLayout>

#include "frame.h"
#include "window.h"

Window::Window()
    : m_lineEdit  ( new QLineEdit( this ) )
    , m_pushButton( new QPushButton( tr( "Draw" ), this ) )
    , m_frame     ( new Frame( this ) )
{
    connect( m_pushButton, SIGNAL( clicked() )
           , SLOT( onButtonClicked() ) );

    QHBoxLayout*const hLayout = new QHBoxLayout;
    hLayout->addWidget( m_lineEdit );
    hLayout->addWidget( m_pushButton );

    QVBoxLayout*const vLayout = new QVBoxLayout( this );
    vLayout->addLayout( hLayout );
    m_frame->setFixedSize( 300, 400 );
    vLayout->addWidget( m_frame );

    setLayout( vLayout );
}

void Window::onButtonClicked()
{
    const int r = m_lineEdit->text().toInt(); // r == 0 if invalid
    m_frame->setCircleRadius( r );
    m_frame->update();
}
#包括
#包括
#包括
#包括
#包括“frame.h”
#包括“window.h”
Window::Window()
:m_lineEdit(新QLineEdit(此))
,m_按钮(新的QPushButton(tr(“Draw”),此按钮))
,m_帧(新帧(本))
{
连接(m_按钮,信号(点击)()
,插槽(onButtonClicked());
QHBoxLayout*const hLayout=新的QHBoxLayout;
hLayout->addWidget(m_lineEdit);
H布局->添加小部件(m_按钮);
QVBoxLayout*const vLayout=新的QVBoxLayout(此);
vLayout->addLayout(hLayout);
m_框架->设置固定尺寸(300400);
vLayout->addWidget(m_框架);
设置布局(vLayout);
}
无效窗口::onButtonClicked()
{
const int r=m_lineEdit->text().toInt();//如果无效,r==0
m_框架->设置环形(r);
m_框架->更新();
}
框架h:

#pragma once

#include <QFrame>

class Frame : public QFrame
{
Q_OBJECT

public:
    Frame( QWidget* );

    void setCircleRadius( int );

protected:
    void paintEvent( QPaintEvent* );

private:
    int m_radius;
};
#pragma一次
#包括
类框架:公共QFrame
{
Q_对象
公众:
框架(QWidget*);
无效塞西乐代斯(int);
受保护的:
无效油漆事件(QPaintEvent*);
私人:
int m_半径;
};
frame.cpp:

#include <QPainter>

#include "frame.h"

Frame::Frame( QWidget* parent )
    : QFrame( parent )
    , m_radius( 0 )
{
    setFrameStyle( QFrame::Box );
}

void Frame::setCircleRadius( int radius )
{
    m_radius = radius;
}

void Frame::paintEvent( QPaintEvent* pe )
{
    QFrame::paintEvent( pe );

    if ( m_radius > 0 )
    {
        QPainter p( this );
        p.drawEllipse( rect().center(), m_radius, m_radius );
    }
}
#包括
#包括“frame.h”
Frame::Frame(QWidget*父项)
:QFrame(父级)
,m_半径(0)
{
setFrameStyle(QFrame::Box);
}
空帧::setCircleRadius(整数半径)
{
m_半径=半径;
}
无效帧::paintEvent(QPaintEvent*pe)
{
QFrame::paintEvent(pe);
如果(m_半径>0)
{
油漆工p(本);
p、 抽屉(矩形().中心(),m_半径,m_半径);
}
}

“您不能直接绘制到框架上。”为什么不呢?“QFrame类是可以具有框架的小部件的基类。“您仍然可以直接绘制到
QFrame
或其任何子类上。”。请参阅一个工作示例。我知道QGraphicsView和QGraphicscene是我所需要的,但我无法在QGraphicscene中放置我想要的文本。该类的addText()方法没有指定坐标的参数。马丁·贝克特:这就是我要你证明的。我曾经在一个Qt应用程序上工作,这个应用程序在
QGraphicsView
出现之前就已经编写好了,我们从来没有费心移植到它上面,因为一切都很好
QGraphicsView
是GUI的一个不错的新部分,但我不会说它是强制性的。