展示多页pdf报错 程序崩溃

layout->addWidget(pdfBrowser); 执行这段代码程序就崩溃,,求帮忙

#include "pdfbrowser.h"
#include 
#include 
#include 
PDFBrowser::PDFBrowser(QWidget *parent)
    : QWidget{parent}
{
    setAttribute(Qt::WA_OpaquePaintEvent);
    setAttribute(Qt::WA_StaticContents);
    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    vScrollBar = new QScrollBar(Qt::Vertical, this);
    hScrollBar = new QScrollBar(Qt::Horizontal, this);
    vScrollBar->setVisible(false);
    hScrollBar->setVisible(false);

    m_scrollArea = new QScrollArea(this);
    m_scrollArea->setBackgroundRole(QPalette::Base);
    m_scrollArea->setAlignment(Qt::AlignCenter);
    m_scrollArea->setFrameShape(QFrame::NoFrame);
    m_scrollArea->setVerticalScrollBar(vScrollBar);
    m_scrollArea->setHorizontalScrollBar(hScrollBar);
    m_scrollArea->setWidgetResizable(true);

    QVBoxLayout* layout = new QVBoxLayout;
    layout->addWidget(m_scrollArea);

    setLayout(layout);
    connect(vScrollBar, &QScrollBar::valueChanged, this, &PDFBrowser::onScrollBarValueChanged);
    connect(hScrollBar,  &QScrollBar::valueChanged, this, &PDFBrowser::onScrollBarValueChanged);

    document = nullptr;
    qDebug()<<"到这里了";
}

PDFBrowser::~PDFBrowser(){
    if(m_scrollArea!=nullptr)
       delete m_scrollArea;
    if(vScrollBar!=nullptr)
        delete vScrollBar;
    if(hScrollBar!=nullptr)
        delete hScrollBar;

    if(document!=nullptr)
        delete document;

    FPDF_DestroyLibrary();
}


void PDFBrowser::resizeEvent(QResizeEvent *event){

    //在widget重新变更位置时改变scrollbar
    int totalHeight = document->getTotalHeightInPixel();
    int maxWidth = document->getMaxWidthInPixel();
    vScrollBar->setRange(0, totalHeight - m_scrollArea->height());
    hScrollBar->setRange(0, maxWidth - m_scrollArea->width());
    redraw();
    QWidget::resizeEvent(event);

}

PDFDocument* PDFBrowser::loadPDF(const QString& fileName){
    qDebug()<<"hi hi hi555";
    FPDF_InitLibrary();

    FPDF_DOCUMENT pdocument = FPDF_LoadDocument(fileName.toStdString().c_str(), nullptr);
     qDebug()<<"hi hi hi556";
    if (pdocument) {
        PDFDocument* document = new PDFDocument(pdocument);
         qDebug()<<"hi hi hi551";
        document->loadAllPage();
        this->document = document;

    };
     redraw();
    qDebug()<<"hi hi hi";
    return  this->document;
}


void PDFBrowser::redraw(){

     qDebug()<<"okoi2";
            if (document == nullptr) {
                return;
            }
qDebug()<<"okoi3";

            QPixmap result(m_scrollArea->width(), m_scrollArea->height());

            QPainter painter(&result);

            // 设置背景颜色
            painter.setBackground(Qt::darkGray);
            painter.setBrush(Qt::darkGray);

            // 获取widget大小
            int canvasWidth = m_scrollArea->width();
            int canvasHeight = m_scrollArea->height();

            // 填充矩形区域
            painter.drawRect(0, 0, canvasWidth, canvasHeight);
            painter.fillRect(0, 0, canvasWidth, canvasHeight, Qt::white);

            // Get scrollbar position
            int selection = vScrollBar->value();
            int hSelection = hScrollBar->value();

            // Get canvas size and calculate beginX
            QSize canvasSize = m_scrollArea->size();
            //居中
            int beginX = 0;
            if (canvasSize.width() > document->getMaxWidthInPixel()) {
                beginX = (canvasSize.width() - document->getMaxWidthInPixel()) / 2;
            }

            // Draw PDF pages to QPixmap and show it on canvas

            QGraphicsScene scene;
            QList items;

            int pageAtY = selection;
            PDFPage *page = document->getPageAtPixel(pageAtY);
            //获取当前页是第几页
            int index = page->getIndex();
            //前几页的总长度
            int temp = 0;
            for(int i=0;igetAllPage()[i].getPageSizeInPixel(document->getFPdf_DOCUMENT())[1];
            }
            painter.setBrush(QColor(Qt::white));
            // 绘制矩形并填充背景色
            int x = -hSelection + beginX;
            int y = 0;
            int width = document->getMaxWidthInPixel();
            int height = canvasHeight;
            painter.drawRect(x, y, width, height);
            painter.fillRect(x, y, width, height, painter.brush());

            // 当前页应该在这个位置绘制
            int maginY = temp - selection;
            int paintedCount = 0;
            int drawY = maginY;
            PDFPage *currentPage = nullptr;


            QList list;

            while (paintedCount <=canvasHeight) {
                if (currentPage == page) {
                    break;
                }
                currentPage = page;
                int pageWidth = currentPage->getPageSizeInPixel(this->document->getFPdf_DOCUMENT())[0];
                int pageHeight = currentPage->getPageSizeInPixel(this->document->getFPdf_DOCUMENT())[1];

                QGraphicsPixmapItem* item = new QGraphicsPixmapItem(currentPage->render(-hSelection + beginX, drawY, pageWidth, pageHeight, 0, 0));
                item->setPos(-hSelection + beginX, drawY);
                items.append(item);
                pageAtY += currentPage->getPageSizeInPixel(this->document->getFPdf_DOCUMENT())[1];
                page = document->getPageAtPixel(pageAtY);

                // 已经绘制了这么多,离整个clientArea还有一段距离,不够的话接着取下一页
                paintedCount += pageHeight + maginY;
                // 下一页的坐标(滚动条偏移+当前页大小+偏移),多一个像素去寻找下一页
                pageAtY = pageHeight + selection + maginY + 1;
                // 下一页画的y坐标
                drawY += pageHeight;
            }

            int px = -hSelection + beginX;
            int py = maginY;

            // 在绘图设备上绘制所有QPixmap
           // foreach (const QPixmap& pixmap, list) {
             //   painter.drawPixmap(px, py, pixmap);

               // int x1 = px;
                //int y1 = pixmap.height() + py + 1;
                //int x2 = pixmap.width() + px;
                //int y2 = y1;
                //painter.drawLine(x1, y1, x2, y2);

                //py += pixmap.height() + 1; // 两个QPixmap之间加上10px的间距
            //}

            foreach(QGraphicsPixmapItem* item, items) {
                   scene.addItem(item);
            }
            // 在绘图设备上绘制所有QGraphicsPixmapItem
            scene.render(&painter);

            qDebug()<<"oko5";
            QLabel  *label =  new QLabel();
            label->setPixmap(result);
             qDebug()<<"oko7";
            m_scrollArea->layout()->addWidget(label);
              qDebug()<<"oko6";
            painter.end();
            qDebug()<<"okoi";

}
下面贴上测试类,,



int main(int argc, char* argv[])
{
    QApplication a(argc, argv);


       QWidget window;
          window.setWindowTitle("PDF Browser");

          PDFBrowser* pdfBrowser = new PDFBrowser(&window);
          pdfBrowser->loadPDF("D:\\pdfD\\040300122068.pdf");

          QVBoxLayout* layout = new QVBoxLayout;
          layout->addWidget(pdfBrowser);

          window.setLayout(layout);
          window.show();;

    return a.exec();
}


参考GPT和自己的思路:

在这段代码中,可能存在一些指针的错误或者内存管理的问题导致程序崩溃。建议先对代码进行调试,查看具体的错误信息,并检查每一个指针的有效性。例如,可能需要在使用指针之前先进行判断是否为空指针。另外也可以考虑通过添加一些调试信息,来确定出现崩溃的具体位置。

参考GPT和自己的思路:

根据提供的代码,可能是由于在PDFBrowser类的构造函数中,没有为pdfBrowser对象设置父窗口,导致程序在执行layout->addWidget(pdfBrowser)时崩溃。解决方法是确保pdfBrowser对象有正确的父窗口,例如:

PDFBrowser* pdfBrowser = new PDFBrowser(parentWidget); // parentWidget是pdfBrowser的父窗口对象,可以替换成实际的对象。

参考GPT和自己的思路:根据提供的代码无法完全定位程序崩溃的原因,建议对程序进行调试和测试。

以下是几个可能出现问题的地方,可以逐一排查:

1 图形视图框架的使用问题:程序中使用了 Qt 的图形视图框架 QGraphicsScene 和 QGraphicsPixmapItem 进行 PDF 页面的绘制。可能存在问题的地方包括:QGraphicsScene 或 QGraphicsPixmapItem 对象的创建、添加、删除等操作是否正确,是否存在对象被重复添加、删除等问题,是否使用了已经被销毁的对象等。可以在程序运行时使用 Qt Creator 的调试功能进行查看和断点调试。

2 PDF 页面的处理问题:程序中使用了 Foxit PDF SDK 进行 PDF 文档的加载和页面处理。可能存在问题的地方包括:PDF 文档加载是否成功,PDF 页面对象的创建、释放是否正确,是否存在访问已经被销毁的对象等问题。可以在程序运行时检查加载的 PDF 文档是否正确,以及通过对 PDFDocument、PDFPage 等对象的调试,查看是否存在问题。

3 界面布局的问题:程序中使用了 Qt 的布局管理器进行界面布局。可能存在问题的地方包括:控件之间的布局关系是否正确,控件的大小是否合适,控件之间的空隙是否过大或过小等。可以在程序运行时查看布局是否正确,或者在界面设计时逐步调整控件的大小和位置,进行排查。

需要注意的是,程序崩溃的原因可能存在于多个地方,需要逐一排查。建议对代码进行逐行调试,对出现异常的地方进行检查,并根据异常信息进行修正。

代码我可以全都提供,没有几个类,

基于最新版ChatGPT4的回答,望采纳!!!有其他问题也可以询问我哦、”(最新版更智能,功能更加强大)

根据您提供的代码,我发现问题可能出在redraw()方法中,当在QScrollArea中添加QLabel控件时,程序可能崩溃。我推测这可能与QScrollArea的布局管理有关。您可以尝试创建一个布局管理器来管理QScrollArea中的控件。例如,可以使用QVBoxLayoutQHBoxLayout

首先,在PDFBrowser的构造函数中添加一个布局管理器:

cppCopy code
PDFBrowser::PDFBrowser(QWidget *parent)
    : QWidget{parent}
{
    ...
    m_scrollArea = new QScrollArea(this);
    ...
    m_scrollAreaContentLayout = new QVBoxLayout;
    QWidget *scrollAreaContent = new QWidget;
    scrollAreaContent->setLayout(m_scrollAreaContentLayout);
    m_scrollArea->setWidget(scrollAreaContent);
    ...
    QVBoxLayout* layout = new QVBoxLayout;
    layout->addWidget(m_scrollArea);

    setLayout(layout);
    ...
}

接下来,修改redraw()方法,在添加QLabel控件时将其添加到新创建的布局管理器中:

cppCopy code
void PDFBrowser::redraw(){
    ...
    QLabel  *label =  new QLabel();
    label->setPixmap(result);
    m_scrollAreaContentLayout->addWidget(label);
    ...
}

这样,QLabel将被正确添加到QScrollArea中,并且应该可以解决程序崩溃的问题。

如果问题仍然存在,请您提供更多信息,以便我更好地理解问题所在。

该回答引用ChatGPT

如有疑问,可以回复我!

代码中出现了问题,当您将 QLabel 添加到 QScrollArea 时,这会导致程序崩溃。为了解决这个问题,您可以在 PDFBrowser 构造函数中将 QLabel 设置为 QScrollArea 的子部件,如下所示:

在您的 PDFBrowser 类的构造函数中,添加以下行:

m_label = new QLabel(this);
m_scrollArea->setWidget(m_label);

这会使您的构造函数看起来像这样:

PDFBrowser::PDFBrowser(QWidget *parent)
    : QWidget{parent}
{
    setAttribute(Qt::WA_OpaquePaintEvent);
    setAttribute(Qt::WA_StaticContents);
    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    vScrollBar = new QScrollBar(Qt::Vertical, this);
    hScrollBar = new QScrollBar(Qt::Horizontal, this);
    vScrollBar->setVisible(false);
    hScrollBar->setVisible(false);

    m_scrollArea = new QScrollArea(this);
    m_scrollArea->setBackgroundRole(QPalette::Base);
    m_scrollArea->setAlignment(Qt::AlignCenter);
    m_scrollArea->setFrameShape(QFrame::NoFrame);
    m_scrollArea->setVerticalScrollBar(vScrollBar);
    m_scrollArea->setHorizontalScrollBar(hScrollBar);
    m_scrollArea->setWidgetResizable(true);

    m_label = new QLabel(this);
    m_scrollArea->setWidget(m_label);

    QVBoxLayout* layout = new QVBoxLayout;
    layout->addWidget(m_scrollArea);

    setLayout(layout);
    connect(vScrollBar, &QScrollBar::valueChanged, this, &PDFBrowser::onScrollBarValueChanged);
    connect(hScrollBar, &QScrollBar::valueChanged, this, &PDFBrowser::onScrollBarValueChanged);

    document = nullptr;
    qDebug() << "到这里了";
}


同时,您需要在 PDFBrowser 类中添加以下成员变量:

QLabel *m_label;

在 redraw() 函数中,将以下行:

QLabel *label = new QLabel();
label->setPixmap(result);
m_scrollArea->layout()->addWidget(label);

替换为:

m_label->setPixmap(result);


layout->addWidget(pdfBrowser);
这里pdfBrowser是什么内容