【问题标题】:Problems between C++ and qmlC++和qml之间的问题
【发布时间】:2014-11-05 01:45:06
【问题描述】:

我正在使用 Qt Quick Controls 构建一个应用程序,并且我还需要一些 C++(用于打印和读取文件)。我挖了this,所以我根据自己的需要修改了它:

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::list()' 的未定义引用;对 'Bonuri::actualPrint(QPrinter*, QString const&)' 的未定义引用

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

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    应该是:

    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;//...
    

    【讨论】:

    • 问题是QTemporaryFile在超出范围的时候被删除了,怎么办?
    • @user2563892 创建 QTemporaryFile 作为类成员。
    • 谢谢,我是 C++ 的菜鸟,不要有错误的印象。这就是我使用 QML 的原因,可惜 QtQuick 中没有 PrintDialog。
    • 顺便说一句,我以后怎么处理,我只是重写它吗?
    • @user2563892 在文档中看到这个:qt-project.org/doc/qt-4.8/qtemporaryfile.html#autoRemove 也可能简单的 QFile 对你更有用(当你不需要这个文件时删除这个文件)qt-project.org/doc/qt-5/qfile.html
    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多