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