2014-11-04 63 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