Qt未解析的外部符号

时间:2016-10-22 18:19:18

标签: c++ qt

我有类,ImageLabel和ChoiceLabel。 ChoiceLabel继承自ImageLabel。当我尝试创建一个新的ChoiceLabel时,我得到一个未解决的外部符号错误。以下是相关文件:

imagelabel.h

#ifndef IMAGELABEL_H
#define IMAGELABEL_H

#include <QLabel>

class QPixmap;
class QStringList;
class QFileDialog;
class QResizeEvent;

class ImageLabel : public QLabel
{
    Q_OBJECT
public:
    explicit ImageLabel(QWidget *parent = 0);

protected:
    virtual int heightForWidth( int width ) const;
    virtual QSize sizeHint() const;
    QPixmap scaledPixmap() const;
    void setPixmap ( const QPixmap & );
    void resizeEvent(QResizeEvent *);

private:
    QPixmap pix;
};

#endif // IMAGELABEL_H

choicelabel.h

#ifndef CHOICELABEL_H
#define CHOICELABEL_H

class QStringList;

class ChoiceLabel : public ImageLabel
{
    Q_OBJECT
public:
    ChoiceLabel();
private:
    QStringList *imageFiles;
    void mousePressEvent(QMouseEvent *);
    void keyPressEvent(QKeyEvent *);
    void focusInEvent(QFocusEvent *);
    void focusOutEvent(QFocusEvent *);
};

#endif // CHOICELABEL_H

mainwindow.cpp

#include "mainwindow.h"
#include "imagelabel.h"
#include "choicelabel.h"
#include <QGridLayout>

#include <qDebug>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{

    choiceLabelA = new ChoiceLabel; //the problem occurs here
    resultLabel = new ImageLabel;

    centralWidget = new QWidget(this);
    this->setCentralWidget(centralWidget);

    gridLayout = new QGridLayout(centralWidget);
    gridLayout->addWidget(resultLabel);
}

编辑:

imagelabel.cpp

#include "imagelabel.h"
#include <QDebug>

ImageLabel::ImageLabel(QWidget *parent) :
    QLabel(parent)
{
    setMinimumSize(250,250);
    setAlignment(Qt::AlignCenter | Qt::AlignCenter);
    setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);

    QPixmap initialPixmap(250, 250);
    initialPixmap.fill(Qt::black);
    setPixmap(initialPixmap);
}

void ImageLabel::setPixmap ( const QPixmap & p)
{
    pix = p;
    QLabel::setPixmap(scaledPixmap());
}

QPixmap ImageLabel::scaledPixmap() const
{
    return pix.scaled(this->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
}

int ImageLabel::heightForWidth( int width ) const
{
    return pix.isNull() ? this->height() : ((qreal)pix.height()*width)/pix.width();
}

QSize ImageLabel::sizeHint() const
{
    int w = this->width();
    return QSize( w, heightForWidth(w) );
}

void ImageLabel::resizeEvent(QResizeEvent *)
{
    if(!pix.isNull())
        QLabel::setPixmap(scaledPixmap());
}

choicelabel.cpp

#include "choicelabel.h"
#include <QStringList>
#include <QFileDialog>
#include <QFrame>

ChoiceLabel::ChoiceLabel():
    imageFiles()
{
    setFocusPolicy(Qt::StrongFocus);
}

void ChoiceLabel::mousePressEvent(QMouseEvent *)
{
    QFileDialog dialog(this);
    dialog.setFileMode(QFileDialog::ExistingFiles);
    dialog.setNameFilter("Images (*.png *.jpg)");
    dialog.setDirectory("C:/Users/FrankFritz/Desktop/qt/uglypictures");

    if (dialog.exec()){
        imageFiles = dialog.selectedFiles();
        QPixmap pixmap = imageFiles->first();
        setPixmap(pixmap);
    }
}

void ChoiceLabel::keyPressEvent(QKeyEvent *ev)
{
    static int index(0);
    if (ev->key() == Qt::Key_Right){
        index = (index + 1) % imageFiles->length();
        setPixmap( QPixmap(imageFiles->at(index)) );
    }
    if (ev->key() == Qt::Key_Left){
        if (index == 0){
            index = imageFiles->length() - 1;
        }
        else{
            index = (index - 1) % imageFiles->length();
        }
        setPixmap( QPixmap(imageFiles->at(index)) );
    }
}

void ChoiceLabel::focusInEvent(QFocusEvent *)
{
    setFrameStyle(QFrame::StyledPanel);
}

void ChoiceLabel::focusOutEvent(QFocusEvent *)
{
    setFrameStyle(QFrame::NoFrame);
}

1 个答案:

答案 0 :(得分:1)

最有可能

ChoiceLabel::ChoiceLabel():
    imageFiles()
{
    setFocusPolicy(Qt::StrongFocus);
}


ChoiceLabel::ChoiceLabel(QWidget *parent): ImageLabel(parent)
{
    setFocusPolicy(Qt::StrongFocus);
}

忘记调用基类的构造函数。也忘了在自己的构造函数中为QWidget *指定父ChoiceLabel

请参阅What are the rules for calling the superclass constructor?以供参考。