• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            逛奔的蝸牛

            我不聰明,但我會很努力

               ::  :: 新隨筆 ::  ::  :: 管理 ::

            =====================================Widget.h=====================================

            #ifndef WIDGET_H

            #define WIDGET_H


            #include <QWidget>


            namespace Ui {

                class Widget;

            }


            class Widget : public QWidget {

                Q_OBJECT

            public:

                Widget(QWidget *parent = 0);

                ~Widget();


            protected:

                virtual void changeEvent(QEvent *e);

                virtual bool eventFilter(QObject *watched, QEvent *e);

                void paintOnWidget(QWidget *w);


            private:

                Ui::Widget *ui;

            };


            #endif // WIDGET_H



            =====================================Widget.cpp=====================================

            #include "Widget.h"

            #include "ui_Widget.h"

            #include <QtGui/QPainter>


            Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {

                ui->setupUi(this);

                ui->widget->installEventFilter(this);

            }


            Widget::~Widget() {

                delete ui;

            }


            void Widget::changeEvent(QEvent *e) {

                QWidget::changeEvent(e);

                switch (e->type()) {

                case QEvent::LanguageChange:

                    ui->retranslateUi(this);

                    break;

                default:

                    break;

                }

            }


            bool Widget::eventFilter(QObject *watched, QEvent *e) {

                if (watched == ui->widget) {

                    if (e->type() == QEvent::Paint) {

                        paintOnWidget(ui->widget);

                        return true;

                    }

                }


                return QWidget::eventFilter(watched, e);

            }


            void Widget::paintOnWidget(QWidget *w) {

                QPainter painter(w);


                QFontMetrics metrics = painter.fontMetrics();

                int textHeight = metrics.ascent() + metrics.descent();


                int leftWidth = metrics.width(tr("9000")) + 5;

                int rightWidth = metrics.width(tr("()"));

                int width = w->size().width() - leftWidth - rightWidth;

                int height = w->size().height() - 3 * textHeight;


                // 繪制外框

                painter.drawRect(0, 0, w->size().width() -1, w->size().height() - 1);

                // 移動坐標系

                //painter.translate(inset * 2, ui->yearWidget->size().height() - inset);

                painter.translate(leftWidth, 1.75 * textHeight + height);


                int totalCount = 9000; // 默認每年收入9000件衣服

                int count = 10;        // 分成10

                float deltaX = width / 12.0f;         // x坐標上每分的寬度

                float deltaY = (float)height / count; // y坐標上每分的寬度



                // 畫橫坐標

                painter.drawLine(0, 0, width, 0);

                for (int i = 1; i <= 12; ++i) {

                    QString month = tr("%1").arg(i);

                    int stringWidth = metrics.width(month);


                    // 繪制坐標刻度

                    painter.drawLine(deltaX * i, 0, deltaX * i, 4);


                    // 繪制坐標處的月

                    int monthX = deltaX * (i - 1) + ((deltaX - stringWidth) / 2);

                    painter.drawText(monthX, textHeight, month);

                }


                // 畫縱坐標

                painter.drawLine(0, 0, 0, -height);

                painter.drawText(-metrics.width(tr("()")),

                                 -(deltaY * count + textHeight / 2 + metrics.descent()),

                                 tr("()"));

                for (int i = 1; i <= count; ++i) {

                    QString value = QString("%1").arg(i * totalCount / count);

                    int stringWidth = metrics.width(value);


                    // 繪制坐標刻度

                    painter.drawLine(-4, -i * deltaY, 0, -i * deltaY);


                    // 繪制坐標值

                    //painter.drawText(-stringWidth - 4, -i * deltaY + stringHeight / 2, value);

                    painter.drawText(-stringWidth - 4, -(deltaY * i + textHeight / 2 - metrics.ascent()), value);

                }


                //    // 繪制每個月收到的服飾

                //    painter.setBrush(Qt::BDiagPattern);

                //    for (int i = 0; i < yearList.size(); ++i) {

                //        painter.setPen(Qt::black);

                //        int fineryCount = yearList.at(i); // i + 1個月收到的服飾件數

                //        int h = fineryCount / (float)totalCount * height;

                //        painter.drawRect(deltaX * i + 2, 0, deltaX - 4, -h);

                //

                //        // 繪制收到的服飾件數

                //        QString fineryString = QString("%1").arg(fineryCount);

                //        int stringWidth = metrics.width(fineryString);

                //

                //        if (h > height) {

                //            h = height;

                //        }

                //

                //        painter.setPen(Qt::red);

                //        //painter.drawText(deltaX * i + (deltaX - stringWidth) / 2, -(h + metrics.descent()), fineryString);

                //    }

            }


            posted on 2009-10-31 13:38 逛奔的蝸牛 閱讀(10850) 評論(13)  編輯 收藏 引用 所屬分類: Qt

            評論

            # re: Qt:在widget的外部進行繪制帶有坐標軸的圖像[未登錄] 2010-10-25 14:40 liu
            你好
            我build出現這個錯誤
            /home/liuzhiyu/ta-build-desktop/../ta/Widget.cpp:44: error: invalid use of ‘class Ui::Widget’  回復  更多評論
              

            # re: Qt:在widget的外部進行繪制帶有坐標軸的圖像 2010-10-25 14:49 逛奔的蝸牛
            @liu
            Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) {
            ui->setupUi(this);
            ui->widget->installEventFilter(this);
            }

            看這里,需要一個widget的form,因為它是直接用QtCreator拖的。
            在這個form里面,又有一個widget:ui->widget->這里就可以看到。
            為了方便,就直接這樣做了,關鍵的信息是使用EventFilter來處理繪制消息  回復  更多評論
              

            # re: Qt:在widget的外部進行繪制帶有坐標軸的圖像[未登錄] 2010-10-26 15:44 liu
            我把
            ui->setupUi(this);
            ui->widget->installEventFilter(this);
            改為
            ui->setupUi(this);
            this->installEventFilter(this);

            后面
            bool Widget::eventFilter(QObject *watched, QEvent *e) {
            if (watched == ui->widget) {
            if (e->type() == QEvent::Paint) {
            paintOnWidget(ui->widget);
            return true;
            }
            }

            return QWidget::eventFilter(watched, e);
            }
            中的ui->widget也改為this就通過了  回復  更多評論
              

            # re: Qt:在widget的外部進行繪制帶有坐標軸的圖像 2010-10-27 16:23 lily
            你好,
            我想將采集回來的數據(二維數組)在QT里將曲線顯示出來,可不可采用你文章里的方法,還是通過在form窗體上同個Drawer類來實現。
            謝謝!
            剛開始學QT,霧茫茫的~~~~  回復  更多評論
              

            # re: Qt:在widget的外部進行繪制帶有坐標軸的圖像 2010-10-27 16:27 逛奔的蝸牛
            @lily
            此文中的方法,是當時我處理繪制時有多個Widget,要在不同的情況對其進行繪制,所以在要不同的Widget上繪制。

            如果你的數據只在一個Widget中繪制,就不需要這么麻煩,直接在一個Widget的paint方法中繪制就可以了。當然,這樣做也沒有任何問題。  回復  更多評論
              

            # re: Qt:在widget的外部進行繪制帶有坐標軸的圖像 2010-10-27 16:46 lily
            @逛奔的蝸牛
            好的,我再想想看,謝謝你~~~  回復  更多評論
              

            # re: Qt:在widget的外部進行繪制帶有坐標軸的圖像[未登錄] 2010-10-27 22:17 liu
            @lily
            我的情況和你差不多 也是初學者 也是顯示數據 我的QQ: 977925831
            有空加我阿
              回復  更多評論
              

            # re: Qt:在widget的外部進行繪制帶有坐標軸的圖像[未登錄] 2010-10-27 22:32 liu
            @逛奔的蝸牛
            請問怎樣繪制多個窗口的坐標圖像,本文是一個窗口,多個窗口的實現,怎么辦?
            我想通過按鈕來切換幾副坐標圖 樓主能不能指點迷津啊?謝謝。。。。  回復  更多評論
              

            # re: Qt:在widget的外部進行繪制帶有坐標軸的圖像 2011-11-22 19:41 1263
            在widget的外部進行繪制帶有坐標軸的圖像  回復  更多評論
              

            # re: Qt:在widget的外部進行繪制帶有坐標軸的圖像[未登錄] 2011-12-08 21:29 jasper
            請問問題解決了沒?謝謝!  回復  更多評論
              

            # re: Qt:在widget的外部進行繪制帶有坐標軸的圖像[未登錄] 2012-03-05 18:36 wang
            請問加上您注釋掉的那部分代碼后,有個yearList變量是在哪里定義的?  回復  更多評論
              

            # re: Qt:在widget的外部進行繪制帶有坐標軸的圖像 2014-06-26 20:35 風過不知
            你的form 是指ui 里面的form layout控件嗎?@逛奔的蝸牛
              回復  更多評論
              

            # re: Qt:在widget的外部進行繪制帶有坐標軸的圖像 2014-06-26 21:24 風過不知
            @liu
            真理!  回復  更多評論
              

            国产精品久久久久影院色| 免费无码国产欧美久久18| 91精品国产综合久久四虎久久无码一级| 久久久网中文字幕| 日韩AV无码久久一区二区| 久久精品国产秦先生| 四虎国产精品成人免费久久| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 久久精品国产精品国产精品污 | 久久久精品视频免费观看| 久久精品国产亚洲αv忘忧草| 91久久香蕉国产熟女线看| 一级a性色生活片久久无| 99久久中文字幕| 综合网日日天干夜夜久久| 久久最近最新中文字幕大全 | 国产免费久久久久久无码| 日韩久久久久久中文人妻 | 99久久人妻无码精品系列| 久久久久亚洲AV成人网人人网站| 久久香综合精品久久伊人| 亚洲欧洲精品成人久久奇米网| 99久久国产热无码精品免费久久久久 | 亚洲午夜久久久久久久久久| 欧美久久久久久精选9999| 久久精品草草草| 一本色道久久88精品综合| 久久影视国产亚洲| 久久人人爽人爽人人爽av| 久久国产福利免费| 999久久久免费国产精品播放| 精品综合久久久久久888蜜芽| 亚洲AV成人无码久久精品老人| 久久婷婷午色综合夜啪| 麻豆成人久久精品二区三区免费 | 日本道色综合久久影院| 成人国内精品久久久久一区| 久久人人爽人人爽人人片AV不| 精品久久久久香蕉网| 国产精品久久国产精麻豆99网站 | 嫩草影院久久国产精品|