QT Plugin遇到了问题,求救
系统:WindowXp
工具:VS2005
QT版本:4.5.3
////////////////////////////////////////////////
//iconeditor.h
////////////////////////////////////////////////
#ifndef ICONEDITOR_H
#define ICONEDITOR_H
#include <qimage.h>
#include <qwidget.h>
#include <QtDesigner/QDesignerExportWidget>
class QDESIGNER_WIDGET_EXPORT IconEditor : public QWidget
{
Q_OBJECT
Q_PROPERTY(QColor penColor READ penColor WRITE setPenColor)
Q_PROPERTY(QImage iconImage READ iconImage WRITE setIconImage)
Q_PROPERTY(int zoomFactor READ zoomFactor WRITE setZoomFactor)
public:
IconEditor(QWidget *parent = 0);
void setPenColor(const QColor &newColor);
QColor penColor() const { return curColor; }
void setZoomFactor(int newZoom);
int zoomFactor() const { return zoom; }
void setIconImage(const QImage &newImage);
const QImage &iconImage() const { return image; }
QSize sizeHint() const;
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
private:
void drawImagePixel(QPainter *painter, int i, int j);
void setImagePixel(const QPoint &pos, bool opaque);
QColor curColor;
QImage image;
int zoom;
};
#endif
////////////////////////////////////////////////
//iconeditor.cpp
////////////////////////////////////////////////
#include <qpainter.h>
#include <QMouseEvent>
#include "iconeditor.h"
IconEditor::IconEditor(QWidget *parent)
: QWidget(parent)
{
setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
curColor = Qt::black;
zoom = 8;
image = QImage(size(),QImage::Format_ARGB32);
image.fill(qRgba(0, 0, 0, 0));
}
QSize IconEditor::sizeHint() const
{
QSize size = zoom * image.size();
if (zoom >= 3)
size += QSize(1, 1);
return size;
}
void IconEditor::setPenColor(const QColor &newColor)
{
curColor = newColor;
}
void IconEditor::setIconImage(const QImage &newImage)
{
if (newImage != image) {
image.detach();
update();
updateGeometry();
}
}
void IconEditor::setZoomFactor(int newZoom)
{
if (newZoom < 1)
newZoom = 1;
if (newZoom != zoom) {
zoom = newZoom;
update();
updateGeometry();
}
}
void IconEditor::paintEvent(QPaintEvent *)
{
QPainter painter(this);
if (zoom >= 3) {
painter.setPen(palette().foreground().color());
for (int i = 0; i <= image.width(); ++i)
painter.drawLine(zoom * i, 0,
zoom * i, zoom * image.height());
for (int j = 0; j <= image.height(); ++j)
painter.drawLine(0, zoom * j,
zoom * image.width(), zoom * j);
}
for (int i = 0; i < image.width(); ++i) {
for (int j = 0; j < image.height(); ++j)
drawImagePixel(&painter, i, j);
}
}
void IconEditor::drawImagePixel(QPainter *painter, int i, int j)
{
QColor color;
QRgb rgb = image.pixel(i, j);
if (qAlpha(rgb) == 0)
color = palette().dark().color();
else
color.setRgb(rgb);
if (zoom >= 3) {
painter->fillRect(zoom * i + 1, zoom * j + 1,
zoom - 1, zoom - 1, color);
} else {
painter->fillRect(zoom * i, zoom * j,
zoom, zoom, color);
}
}
void IconEditor::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
setImagePixel(event->pos(), true);
else if (event->button() == Qt::RightButton)
setImagePixel(event->pos(), false);
}
void IconEditor::mouseMoveEvent(QMouseEvent *event)
{
if (event->button() & Qt:: LeftButton)
setImagePixel(event->pos(), true);
else if (event->button() & Qt::RightButton)
setImagePixel(event->pos(), false);
}
void IconEditor::setImagePixel(const QPoint &pos, bool opaque)
{
int i = pos.x() / zoom;
int j = pos.y() / zoom;
if (image.rect().contains(i, j)) {
if (opaque)
image.setPixel(i, j, penColor().rgb());
else
image.setPixel(i, j, qRgba(0, 0, 0, 0));
QPainter painter(this);
drawImagePixel(&painter, i, j);
}
}
////////////////////////////////////////////////
//iconeditorplugin.h
////////////////////////////////////////////////
#include <QDesignerCustomWidgetInterface>
class IconEditorPlugin : public QObject,
public QDesignerCustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
IconEditorPlugin(QObject* parent = 0);
QString name() const;
QString includeFile() const;
QString group() const;
QIcon icon() const;
QString toolTip() const;
QString whatsThis() const;
bool isContainer() const;
QWidget* createWidget(QWidget* parent);
};
////////////////////////////////////////////////
//iconeditorplugin.cpp
////////////////////////////////////////////////
#include "../iconeditor/iconeditor.h"
#include "iconeditorplugin.h"
#include <QtPlugin>
IconEditorPlugin::IconEditorPlugin(QObject* parent)
:QObject(parent)
{
}
QString IconEditorPlugin::name() const
{
return "IconEditor";
}
QString IconEditorPlugin::group() const
{
return tr("Image Manipulation Widgets");
}
QString IconEditorPlugin::includeFile() const
{
return "iconeditor.h";
}
QIcon IconEditorPlugin::icon() const
{
return QIcon(":/images/iconeditor.png");
}
QString IconEditorPlugin::toolTip() const
{
return "Icon Editor";
}
QString IconEditorPlugin::whatsThis() const
{
return "Widget for creating and editing icons";
}
QWidget* IconEditorPlugin::createWidget(QWidget* parent)
{
return new IconEditor(parent);
}
Q_EXPORT_PLUGIN2(iconeditorplugin, IconEditorPlugin)
////////////////////////////////////////////////
//iconeditorplugin.pro
////////////////////////////////////////////////
CONFIG += designer plugin
TEMPLATE = lib
HEADERS = ../iconeditor/iconeditor.h \
iconeditorplugin.h
SOURCES = ../iconeditor/iconeditor.cpp \
iconeditorplugin.cpp
RESOURCES = iconeditorplugin.qrc
DESTDIR = $$[QT_INSTALL_PLUGINS]/designer
/////////////////////////////////////////////////////////////////
qmake -t vclib 生成VS2005工程成功
然后编译链接,出现错误:
fatal error LNK1104: 无法打开文件“d:\Qt\qt-win-opensource-src-4.5.3\plugins\designer\iconeditorplugind.lib”
这个错误很奇怪,因为如果链接成功才会生成iconeditorplugind.lib。
我是按照<<C++ GUI QT4>>上编写的.pro文件。
另外我直接nmake QT的 demos\arthurplugin 也出现同样的问题。但是除了plugin,其他的如 demos\affine 正确。
请问出现这个问题的原因是什么?怎么解决?
谢谢。