• 6281阅读
  • 5回复

绘图问题 [复制链接]

上一主题 下一主题
离线superleo
 
只看楼主 正序阅读 楼主  发表于: 2008-10-21
— 本帖被 XChinux 执行加亮操作(2008-11-02) —
我想在一个继承自QScrollArea的类中绘制图片
以下是代码:

class MdiChild : public QScrollArea
{
    Q_OBJECT

public:
    MdiChild(QWidget *parent = 0);
    ~MdiChild();

    bool save();
    bool saveAs();
    bool print();
    bool loadFile(QString &fileName);
    void setPara(int headerOfferset,int pixelPerLine);

    QString currentFile(){return curFile;}
    void setCurrentFile(QString &fileName);

protected:
    void paintEvent ( QPaintEvent * event );

private:
    int size;
    QString curFile;
    QImage *image;
    uchar *bits;
    QWidget *view;
   
    int headerOffset;
    int pixelPerLine;
};

MdiChild::MdiChild(QWidget *parent) : QScrollArea(parent)
{
    image = NULL;
    size = 0;

    view = new QWidget(this);
    this->setWidget(view);
    this->setWidgetResizable(true);
    this->setMinimumSize(300,200);
    this->setAttribute(Qt::WA_DeleteOnClose);
}

void MdiChild::paintEvent ( QPaintEvent * event )
{
    QPainter painter(view);
    painter.drawImage(0,0,*image);
}

如果把paintEvent()函数里的QPainter painter(view) 改成QPainter painter(this->viewport());
一切正常,但是我想要在里面出现滚动条
所以在QScrollArea里加了一个叫做view的widget,现在在这个widget上绘制图片
为什么绘制不出来?

离线superleo
只看该作者 5楼 发表于: 2008-10-22
问题解决了

原因如下:

1. 不应该在viewport中绘图,viewport只是一个视口,滚动条针对的滚动对象是viewport中添加的widget,因此应该在widget中绘图,然后将widget添加到viewport中

2.在viewport中添加widget后,要设置好widget的大小,如果未设置widget的大小,默认为(0,0),绘制的东西就不会显示出来,也会导致显示失败

3. 在QscrollArea中重载paintEvent时,只能使用QPainter painter(this->viewport()),不能使用其他的
离线duduqq

只看该作者 4楼 发表于: 2008-10-21
那你的view就要设置得比可视区域大了就能看到滚动条了,也可以滚动了
离线chaoscxm
只看该作者 3楼 发表于: 2008-10-21
个人认为,在widget view上面画图,那应该在widget view的paintEvent里面画图,而不是在scorllArea里面画
帖子签名(将在每个帖子下方显示)
离线superleo
只看该作者 2楼 发表于: 2008-10-21
这个方法我试过了,滚动条会出来,但是却不滚动
当在view中绘制时,图像是出不来的
只有在viewport中绘制时,图像才能出来
离线duduqq

只看该作者 1楼 发表于: 2008-10-21
当view的大小大于QSCrollArea里会出现滚动条,如果你想让它一开始就出现,可以
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
快速回复
限100 字节
 
上一个 下一个