2014-11-04 36 views
0

我正在构建一个使用Qt Quick Controls的应用程序,并且我还需要一些C++(用于打印和读取文件)。我挖了this,所以我已经将它修改为我的需求:C++和qml之间的问题

bonuri.h

#ifndef BONURI_H 
#define BONURI_H 

#include <QObject> 
#include <QTemporaryFile> 
#include <QIODevice> 
#include <QPainter> 
#include <QtSvg/QSvgRenderer> 
#include <QFile> 
#include <QTextStream> 
#include <QtPrintSupport/QPrintPreviewDialog> 
#include <QtPrintSupport/QPrinter> 

class Bonuri : public QObject { 
    Q_OBJECT 

public: 
    explicit Bonuri(QObject *parent = 0); 
public slots: 
    void printSVG(const QString& in); 
    QString list(); 
    void actualPrint(QPrinter* p, const QString& in); 
}; 

#endif // BONURI_H 

bonuri.cpp

#include "bonuri.h" 

Bonuri::Bonuri(QObject *parent) : 
    QObject(parent) 
{ 
} 

void Bonuri::printSVG(const QString& in){ 
    QPrinter printer(QPrinter::HighResolution); 
    printer.setPaperSize(QPrinter::A5); 
    QPrintPreviewDialog printDialog(&printer); 
    connect(&printDialog, SIGNAL(paintRequested(QPrinter*)), SLOT(actualPrint(QPrinter*, in))); 
    printDialog.exec(); 
} 

void actualPrint(QPrinter* p, const QString& in){ 
    QTemporaryFile file; 
    if (file.open()){ 
      QTextStream out(&file); 
      out << in; 
      QSvgRenderer renderer(file.fileName()); 
      QPainter myPainter(p); 
      myPainter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform); 
      renderer.render(&myPainter); 
    } 
} 

QString list(){ 
    QFile file("Bonuri.json"); 

    QString totalLine; 
    if(file.open(QIODevice::ReadOnly | QIODevice::Text)){ 
     QTextStream in(&file); 
     while (!in.atEnd()){ 
      QString line = in.readLine(); 
      totalLine += line; 
     } 
    } 
    return totalLine; 
} 

的问题是,我没有那么大的C++专家,并且无法进行调试。

问题: moc_bonuri.cpp

未定义参照 'Bonuri ::列表()';未定义引用'Bonuri :: actualPrint(QPrinter *,QString const &)'

还有一件事:你能帮我优化代码吗(我是C++的新手,真的不知道为什么它是这样的是,我只是用例子)。

回答

0

应该是:

void Bonuri::actualPrint(QPrinter* p, const QString& in){ 
    //QTemporaryFile file;//now it is a class member 
    if (file.open()){ 
      QTextStream out(&file); 
      out << in; 
      QSvgRenderer renderer(file.fileName()); 
      QPainter myPainter(p); 
      myPainter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform); 
      renderer.render(&myPainter); 
    } 
} 

QString Bonuri::list(){ 
    QFile file("Bonuri.json"); 

    QString totalLine; 
    if(file.open(QIODevice::ReadOnly | QIODevice::Text)){ 
     QTextStream in(&file); 
     while (!in.atEnd()){ 
      QString line = in.readLine(); 
      totalLine += line; 
     } 
    } 
    return totalLine; 
} 

另一个问题:

connect(&printDialog, SIGNAL(paintRequested(QPrinter*)), SLOT(actualPrint(QPrinter*, in))); 

不能使用的参数比信号了,你可以用更少而不是更多。所以它至少应该是:

connect(&printDialog, SIGNAL(paintRequested(QPrinter*)), SLOT(actualPrint(QPrinter*))); 

但是在这种情况下,你应该完全重写你的方法。

class Bonuri : public QObject { 
    Q_OBJECT 
private: 
    QTemporaryFile file;//... 
+0

问题是,QTemporaryFile被删除时,它超出了范围,所以我能做什么? – user2563892 2014-11-04 17:41:13

+0

@ user2563892创建QTemporaryFile作为类成员。 – Chernobyl 2014-11-04 17:42:30

+0

我该怎么做? – user2563892 2014-11-04 17:42:53