• 7244阅读
  • 10回复

QPainter 一問(部分解決還有問題!!) [复制链接]

上一主题 下一主题
离线jjliao
 
只看楼主 倒序阅读 楼主  发表于: 2010-05-27
我想要点击界面上button然后在界面画一条线有办法办到吗?? 下面是我参考范例写的
void Dialog::paintEvent(QPaintEvent *)
{
    QPainter *painter=new QPainter(this);
    QPen pen(Qt::blue, 4);
    painter->setPen(pen);
    painter->drawLine(13,450,500,450);//畫線
}

这样的确是可以画一条线~~但是他是当我打开界面马上就出现那条线

我是想要当我点击button后才画线 我有稍微修改一下变成 
void Dialog::on_pushButton_8_clicked(QPainter *painter)
{
    painter=new QPainter(this);
    QPen pen(Qt::blue, 4);
    painter->setPen(pen);
    painter->drawLine(13,450,500,450);//畫線
}

on_pushButton_8_clicked(QPainter *painter)这行我是乱打的~~想说试试看~~当然结果是失败
请问大家要怎么修改 请给我一点提示~~谢谢

我在.h檔宣告了 bool isDrawn
然後button 的signal 為 click(bool) Dialog slot 為 DrawnOrNot(bool)
在.cpp檔打上
void Dialog::DrawnOrNot(bool flag)
{
isDrawn = flag;
this->update();
}

void Dialog::paintEvent(QPaintEvent *)
{
QPainter painter(this);
QPen pen(Qt::blue, 4);
painter.setPen(pen);
if (isDrawn)
painter.drawRect(30,428,50,22);//画长方形
}


目前我可以按下button后就把取消画长方形~但是我要的是相反结果!! 我试着改成if (!isDrawn)
但却变成长方形一直存在

请问该怎么办呢


我解决了
我改成if (!isDrawn)
然后把长方形改成变数painter.drawRect(30,428,w,h);//画长方形 
然后在 DrawnOrNot(bool flag) 指定w,h就可以了!!
不过还是有点奇怪,他不给我指定x和y
这是错误讯息
error: no matching function for call to 'QPainter::drawRect(<unresolved overloaded function type>, <unresolved overloaded function type>, int&, int&)'

为什么不能指定x,y??

[ 此帖被jjliao在2010-05-30 21:23重新编辑 ]
离线benbenmajia

只看该作者 1楼 发表于: 2010-05-27
painterEvent是必须有的,这个是架构决定的,你可以在这里不画东西,然后再button的槽中来画
安然.....
离线jjliao
只看该作者 2楼 发表于: 2010-05-27
回 1楼(benbenmajia) 的帖子
所以是?
void Dialog::paintEvent(QPaintEvent *)
{
}

void Dialog::panter()
{
    QPainter *painter=new QPainter(this);
    QPen pen(Qt::blue, 4);
    painter->setPen(pen);
    painter->drawLine(13,450,500,450);//畫線
}

然後button去slot (panter())是這樣嗎??

感謝您回覆~
還請您多多指導~~
[ 此帖被jjliao在2010-05-27 13:06重新编辑 ]
离线xlttap

只看该作者 3楼 发表于: 2010-05-27
你忘记了button中有一个clicked(bool)信号吗?
根据你click这个button的bool值来确定什么画线就可以了。
你先写一个SLOT:
void Dialog::DrawnOrNot(bool flag)
{
  isDrawn = flag;
}

void Dialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPen pen(Qt::blue, 4);
    painter.setPen(pen);
    if (isDrawn)
       painter.drawLine(13,450,500,450);//畫線
}
我简单我快乐
离线jjliao
只看该作者 4楼 发表于: 2010-05-28
回 3楼(xlttap) 的帖子
你的意思是我button 的signal 為 click(bool) 然後 Dialog slot 為 DrawnOrNot(bool)
然後
void Dialog::DrawnOrNot(bool flag)
{
  isDrawn = flag;
}

void Dialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPen pen(Qt::blue, 4);
    painter.setPen(pen);
    if (isDrawn)
       painter.drawLine(13,450,500,450);//畫線
}

這行在打上去是ㄇ??

那請問isDrawn 這是??
我編輯完後 他顯示我沒宣告這個~~
感謝您的回覆~還請您多多指導!!
离线抠涕
只看该作者 5楼 发表于: 2010-05-28
1. Constructor
setAttribute(Qt::WA_PaintOutsidePaintEvent);

2. onClicked()
drawLine()


PS: 这样做后果是, repaint之后 , 所画的东西会消失。因为这个不是在 paintEvent 画的。

LS某兄台 加一个标志位 的方法可行
[ 此帖被抠涕在2010-05-28 13:23重新编辑 ]
离线xlttap

只看该作者 6楼 发表于: 2010-05-28
回 4楼(jjliao) 的帖子
isDrawn是你自己声明的一个变量了。
在.h中声明一个bool isDrawn就可以了。
还有你可以用简体字吗?
[ 此帖被xlttap在2010-05-28 13:25重新编辑 ]
我简单我快乐
离线抠涕
只看该作者 7楼 发表于: 2010-05-28
会打  “ㄇ”  , 兄台估计是宝岛的
离线benbenmajia

只看该作者 8楼 发表于: 2010-05-28
不要太过于局限,可以大胆的想各种实现的方法,前提就是在架构正确的情况下,多试试,多写,只有好处没有坏处
安然.....
离线jjliao
只看该作者 9楼 发表于: 2010-05-29
回 6楼(xlttap) 的帖子
我在.h檔宣告了 bool isDrawn
然後button 的signal 為 click(bool)  Dialog slot 為 DrawnOrNot(bool)
在.cpp檔打上
void Dialog::DrawnOrNot(bool flag)
{
   isDrawn = flag;
   this->update();
}

void Dialog::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPen pen(Qt::blue, 4);
    painter.setPen(pen);
    if (isDrawn)
       painter.drawRect(30,428,50,22);//画长方形
}


目前我可以按下button后就把取消画长方形~但是我要的是相反结果!! 我试着改成if (!isDrawn)
但却变成长方形一直存在

请问该怎么办呢
[ 此帖被jjliao在2010-05-30 20:16重新编辑 ]
离线jjliao
只看该作者 10楼 发表于: 2010-05-29
回 8楼(benbenmajia) 的帖子
感谢您的指导,我会尽量往多方面着想
快速回复
限100 字节
 
上一个 下一个