• 12137阅读
  • 3回复

如何设置滚动条在视图内容不能完全显示的时候才出现以及打开多个窗口在每个文档窗口被点击时就被激活 [复制链接]

上一主题 下一主题
离线孤云白鹤
 
只看楼主 倒序阅读 楼主  发表于: 2010-07-27
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "paintform.h"
#include <QMainWindow>
#include <QtGui>
namespace Ui
{
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void changeEvent(QEvent *e);
    //void mousePressEvent(QMouseEvent *);
    
private:
    //QWidget *pwid;
    QString filename;
    QString curFile;
    Ui::MainWindow *ui;
    QPrinter printer;
    PaintForm *paintForm;
    QMdiSubWindow *subwid;
    
private slots:
    void on_actionClose_triggered();
    void on_action25_triggered();
    void on_action50_triggered();
    void on_action75_triggered();
    void on_actionOpen_triggered();
    void on_action400_triggered();
    void on_actionPrint_triggered();
    void on_actionPrintPreView_triggered();
    void on_action100_triggered();
    void on_action200_triggered();
    void previewPaint(QPrinter *);
    void printPaint(QPrinter *);
    
public slots:
    
};
#endif

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "paintform.h"
#include <QtGui>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QMainWindow *subMain=new QMainWindow;
    QScrollArea *scroll=new QScrollArea;
    subMain->setCentralWidget(scroll);
    paintForm=new PaintForm(ui->mdiArea);
    scroll->setWidget(paintForm);
    subwid=ui->mdiArea->addSubWindow(subMain);
    subwid->setWindowTitle("DispGrl");
    subwid->setMinimumSize(700,500);
    subwid->show();
}
MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type())
    {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}


void MainWindow::on_actionPrint_triggered()
{
    printer.setDocName(curFile);
    printer.setColorMode(QPrinter::GrayScale);
    QPrintDialog printDia(&printer,this);
    //if(printDia.exec()==QDialog::Accepted)
    //{
    //    QPainter painter(&printer);
    //    paintForm->myPaint(painter);
    //}
    connect(&printDia,SIGNAL(accepted(QPrinter*)),this,SLOT(printPaint(QPrinter*)));
    printDia.exec();
}
void MainWindow::printPaint(QPrinter *print)
{
   QPainter painter(print);
   paintForm->myPaint(painter);
}
void MainWindow::on_actionPrintPreView_triggered()
{
    printer.setDocName(curFile);
    QPrintPreviewDialog preview(&printer,this,Qt::Dialog);
    connect(&preview,SIGNAL(paintRequested(QPrinter*)),this,SLOT(previewPaint(QPrinter*)));
    preview.exec();
}
void MainWindow::previewPaint(QPrinter *print)
{
   QPainter painter(print);
   paintForm->myPaint(painter);
}
void MainWindow::on_action400_triggered()
{
    paintForm->sca=4;
    paintForm->setMinimumSize(paintForm->width()*4,paintForm->height()*4);
    paintForm->update();
}
void MainWindow::on_action200_triggered()
{
    paintForm->sca=2;
    paintForm->setMinimumSize(paintForm->width()*2,paintForm->height()*2);
    paintForm->update();
}

void MainWindow::on_action100_triggered()
{
    paintForm->sca=1;
    paintForm->setMinimumSize(paintForm->width()*1,paintForm->height()*1);
    paintForm->update();
}
void MainWindow::on_action75_triggered()
{
    paintForm->sca=0.75;
    paintForm->setMinimumSize(paintForm->width()*0.75,paintForm->height()*0.75);
    paintForm->update();
}
void MainWindow::on_action50_triggered()
{
    paintForm->sca=0.5;
    paintForm->setMinimumSize(paintForm->width()*0.5,paintForm->height()*0.5);
    paintForm->update();
}
void MainWindow::on_action25_triggered()
{
    paintForm->sca=0.25;
    paintForm->setMinimumSize(paintForm->width()*0.25,paintForm->height()*0.25);
    paintForm->update();
}

void MainWindow::on_actionOpen_triggered()
{
    filename=QFileDialog::getOpenFileName(this,tr("Open"),tr("./"),
            tr("SDC Data(*.dat)"));
//  filename=QFileDialog::getOpenFileName(this,tr("Open"),tr("./"),
//    tr("DAT File(*.dat);;ALL(*.*)"));
    curFile=QFileInfo(filename).fileName();
//    if(paintForm)
//    {
//        delete paintForm;
//    }
//    if(subwid)
//    {
//        delete subwid;
//    }
    if(filename=="")
    {
        //QMessageBox::about(this,"DispGraph","please choice a file!");
        return;//跳出此方法,不执行if语句后的内容.
    }
    QMainWindow *subMain=new QMainWindow;
    QScrollArea *scroll=new QScrollArea;
    subMain->setCentralWidget(scroll);
    paintForm=new PaintForm(ui->mdiArea);
    paintForm->set_FileName(filename);
    paintForm->getdata();
    scroll->setWidget(paintForm);
    subwid=ui->mdiArea->addSubWindow(subMain);
    subwid->setWindowTitle(curFile);
    subwid->setMinimumSize(700,500);
    subwid->show();
    //subwid->setLayoutDirection(Qt::LeftToRight);
}
/*void MainWindow::mousePressEvent(QMouseEvent *e)
{
    pwid=this->childAt(e->pos());
    pwid->effectiveWinId();
    qDebug()<<pwid<<e->pos();
}*/
void MainWindow::on_actionClose_triggered()
{
    ui->mdiArea->closeActiveSubWindow();
}





#ifndef SDCDATA_H
#define SDCDATA_H
#include <QtCore>
typedef struct
{
    char type[8];
    char mons[4];
    unsigned char s;
    quint16 m;
    char date1[8];
    struct
    {
        unsigned char torque;
        unsigned char speed;
    }ST[500];
}SDC;

#endif // SDCDATA_H

#ifndef PAINTFORM_H
#define PAINTFORM_H
#include <QtGui>
#include <QWidget>
namespace Ui
{
    class PaintForm;
}

class PaintForm : public QWidget
{
    Q_OBJECT

public:
    PaintForm(QWidget *parent = 0);
    void paintEvent(QPaintEvent *);
    void myPaint(QPainter &painter);
    float sca;
    void getdata();
    void set_FileName(QString filename);
    //quint16 hightLow(quint16 &phl);
    ~PaintForm();

protected:
    void changeEvent(QEvent *e);

private:
    Ui::PaintForm *ui;
    QPoint startPonit;
    float torY[500];
    float speY[500];
    QPointF pointTor[500];
    QPointF pointSpe[500];
    QLineF lineTor[500];
    QLineF lineSpe[500];
    quint16 plus;
    QString fileName;

public slots:

};
#endif

#include "paintform.h"
#include "ui_paintform.h"
#include "SDCData.h"
#include <QtGui>
PaintForm::PaintForm(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::PaintForm)
{
    ui->setupUi(this);
    sca=1;
    plus=3000;  
}

PaintForm::~PaintForm()
{
    delete ui;
}

void PaintForm::changeEvent(QEvent *e)
{
    QWidget::changeEvent(e);
    switch (e->type())
    {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void PaintForm::myPaint(QPainter &painter)
{
    painter.translate(50,40);
    painter.scale(sca,sca);
    QPen pen(Qt::green);
    painter.setPen(pen);
    int len=50;
    int hei=40;
    QString plusStr=QString::number(plus,10);
    QString minsStr="-"+plusStr;
    for(int i=1;i<=51;i++)
    {//49条绿线,2两条黑线
        if(i==1||i==51)
        {//2两条黑线
            pen.setColor(Qt::black);
            painter.setPen(pen);
            painter.drawLine(len,40,len,320);
            len +=10;//每条竖线相隔10个像素
            pen.setColor(Qt::green);
            painter.setPen(pen);
            continue;
        }
        painter.drawLine(len,40,len,320);
        len +=10;
    }


    for(int i=1;i<=15;i++)
    {
        if(i==1||i==8||i==15)
        {
            pen.setColor(Qt::black);
            painter.setPen(pen);
            painter.drawLine(50,hei,550,hei);
            hei +=20;
            pen.setColor(Qt::green);
            painter.setPen(pen);
            continue;
        }
        painter.drawLine(50,hei,550,hei);
        hei +=20;
    }
    pen.setColor(Qt::black);
    painter.setPen(pen);

    len=50;//重新设定间隔宽度的初始值
    for(int i=1;i<=49;i++)
    {
        len +=10;
        if(i%10==0)
        {
            painter.drawLine(len,175,len,185);
            painter.drawLine(len,315,len,320);
        }
        painter.drawLine(len,177,len,183);
        painter.drawLine(len,317,len,320);
    }
    painter.drawText(47,335,"0.0");
    painter.drawText(147,335,"1.0");
    painter.drawText(247,335,"2.0");
    painter.drawText(347,335,"3.0");
    painter.drawText(447,335,"4.0");
    painter.drawText(547,335,"5.0");
    painter.drawText(35,184,"0");
    painter.drawText(15,184,"[%]");
    painter.drawText(555,184,"0");
    painter.drawText(575,184,"[rpm]");
    painter.drawText(30,64,"300");
    painter.drawText(25,304,"-300");
    painter.drawText(555,50,plusStr);
    painter.drawText(555,320,minsStr);
    /******************画曲线部分**********************/
    painter.translate(50,180);//将中间的那条横线的起点设为坐标系原点
    painter.setPen(Qt::red);
    painter.drawLines(lineTor,500);
    painter.setPen(Qt::blue);
    painter.drawLines(lineSpe,498);
}

void PaintForm::getdata()
{
    QFile file;
    file.setFileName(fileName);
    file.open(QIODevice::ReadWrite);
    QDataStream in(&file);
    SDC sdc[1];
    in.readRawData((char *)sdc,sizeof(SDC)*1);//直接将.dat文件的所有内容读到内存中
    plus=sdc[0].m;
    //hightLow(plus);
    for(int i=0;i<=500;i++)
    {
        //qDebug()<<sdc[0].ST.torque<<sdc[0].ST.speed;
        torY=(float)sdc[0].ST.torque;//从文件获得初始数据
        speY=(float)sdc[0].ST.speed;
        //qDebug()<<torY<<speY;
        pointTor=QPointF(i,(128-torY)*24/23);//计算放在坐标系中正确位置
        //pointSpe=QPointF(i,(128-speY)*192/115);
        pointSpe=QPointF(i,(128-speY)*(plus*120)/(115*3000));
    }

    for(int i=0;i<=499;i++)
    {//初始化500条线
        lineTor=QLineF(pointTor,pointTor[i+1]);
        lineSpe=QLineF(pointSpe[i+1],pointSpe[i+2]);
    }
}

/*quint16 PaintForm::hightLow(quint16 &phl)
{//高低位转换
    quint16 hei;
    quint16 low;
    low=phl&0xff00;
    low=low>>8;
    hei=phl&0x00ff;
    hei=hei<<8;
    phl=low+hei;
    return phl;
}*/
void PaintForm::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    myPaint(painter);
}

void PaintForm::set_FileName(QString filename)
{
    this->fileName=filename;
    //qDebug()<<fileName;
}
[ 此帖被孤云白鹤在2010-07-29 14:07重新编辑 ]
谁若游戏人生,他便一事无成;谁不能主宰自己,便永远是一个奴隶............
离线孤云白鹤
只看该作者 1楼 发表于: 2010-07-29
当一个文档窗口获得键盘焦点时,它被激活了。你可以使用setFocus()来激活它,并且用户可以用普通的移动焦点的方式来激活它。当工作区检测到激活变化时,它发射一个windowActivated()信号,并且activeWindow()函数总是返回活动的文档窗口的指针。我的代码已经完全附上 ,该如何实现这标题中的2个功能,请高手们详加指点,有做过多文档视图的大家交流一下。
[ 此帖被孤云白鹤在2010-07-29 14:23重新编辑 ]
谁若游戏人生,他便一事无成;谁不能主宰自己,便永远是一个奴隶............
离线liang6
只看该作者 2楼 发表于: 2011-01-21
没看懂
离线XChinux

只看该作者 3楼 发表于: 2011-01-21
使用QScrollArea或支持滚动条的部件时,这些应该是自动处理的吧?楼主的问题是什么?
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个