免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1068 | 回复: 0
打印 上一主题 下一主题

A small program on QPainter [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-09 21:18 |只看该作者 |倒序浏览
    In Qt,we must put our painting operation in the related paintEvent() funciton.
               
               
                #includeQtGui>
class MyPaint:public QWidget
{
  Q_OBJECT
public:
  MyPaint(QWidget *parent=0,int i=1);
  QSize sizeHint()const;
#if 1
  void drawAnEllipse(QPainter *p);
  void drawAPie(QPainter *p);
  void drawACure(QPainter *p);
#endif
protected:
  void paintEvent(QPaintEvent * );
private:
  int num;
};
MyPaint::MyPaint(QWidget *parent,int i)
  :QWidget(parent),num(i)
{
}
void MyPaint::drawAPie(QPainter *pa1)
{
  pa1->setPen(QPen(Qt::black,15,Qt::SolidLine,Qt::RoundCap,Qt::MiterJoin));
  pa1->setBrush(QBrush(Qt::blue,Qt::DiagCrossPattern));
  pa1->drawPie(0,0,200,140,60*16,270*16);
}
void MyPaint::drawACure(QPainter *pa2)
{
  pa2->setRenderHint(QPainter::Antialiasing,true);
  QPainterPath path;
  path.moveTo(0,220);
  path.cubicTo(100,0,220,0,380,220);
  pa2->setPen(QPen(Qt::black,8));
  pa2->drawPath(path);
}
void MyPaint::drawAnEllipse(QPainter *pa3)
{
  pa3->setRenderHint(QPainter::Antialiasing,true);
  pa3->setPen(QPen(Qt::black,12,Qt::DashDotLine,Qt::RoundCap));
//#define GRADIENTPATTERN
#ifndef GRADIENTPATTERN
  pa3->setBrush(QBrush(Qt::green));
#else
// 该句也有问题,目前不知道如何解决,不过 Qt::LinearGradientPattern换成
// Qt::SolidePattern的话,程序正常。
  pa3->setBrush(QBrush(Qt::green,Qt::LinearGradientPattern));
#endif
// 还有另外两种渐变模式,分别为:QRadialGradient,QConicalGradient
#ifndef GRADIENTPATTERN
  QLinearGradient gradient(0,0,200,140);
  gradient.setColorAt(0.0,Qt::red);
  gradient.setColorAt(0.2,Qt::green);
  gradient.setColorAt(1.0,Qt::black);
  pa3->setBrush(gradient);
#endif
  pa3->drawEllipse(0,0,200,140);
}
QSize MyPaint::sizeHint()const
{
  return QSize(400,400);
}
void MyPaint::paintEvent(QPaintEvent *)
{
  QPainter pa1(this);
  switch (num)
    {
    case 1:
      drawAnEllipse(&pa1);
      break;
    case 2:
      drawAPie(&pa1);
      break;
    case 3:
      drawACure(&pa1);
      break;
    default:
      break;
    }
}
#include"main.moc" //?目前还不清楚这里面是什么,但必须包含进去,否则链接时候会出错。
int main(int argc,char *argv[])
{
  QApplication app(argc,argv);
  QMainWindow *win = new QMainWindow;
  MyPaint *mp1 = new MyPaint(win,1);
  MyPaint *mp2 = new MyPaint(win,2);
  MyPaint *mp3 = new MyPaint(win,3);
  
  QSplitter sp(win);
  sp.addWidget(mp1);
  sp.addWidget(mp2);
  sp.addWidget(mp3);
  win->setCentralWidget(&sp);
#if 0
  mp1->show();
  mp2->show();
  mp3->show();
#endif
  win->show();
  return app.exec();
}



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/50916/showart_418752.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP