• 4175阅读
  • 0回复

linux环境下qt划线的问题 [复制链接]

上一主题 下一主题
离线sagapoxf
 

只看楼主 倒序阅读 楼主  发表于: 2011-07-25
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2011-07-26) —
关键词: QT4求助
编译环境arm+linux+qt4
现在想在qt4上画一坐标:程序代码如下:
main.cpp代码:

#include <QApplication>
#include <QDialog>
#include "ui_widget.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Ui_Widget ui;
QDialog *dialog = new QDialog;
ui.setupUi(dialog);
dialog->show();
return app.exec();
}
Widgt.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;};
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);
    this->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 == this) {
if (e->type() == QEvent::Paint) {
paintOnWidget(this);
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);
    //    }}

编译之后没有错误,但是运行之后,并没有显示坐标。不知道什么原因。往大侠指教。谢谢
快速回复
限100 字节
 
上一个 下一个