2010-05-19 82 views
1

我正在尝试做一个国际象棋游戏。所以我想在用户点击并拖动硬币时移动棋子图片。 我使用哪个类来Qt-如何根据鼠标移动在屏幕上移动图片

更新

最后,我只需要编辑这是在给定拖动和删除实例拼图代码。因此我试图了解这些功能。但我仍然没有得到某些东西。我正在执行下面的代码,但图片没有移动。当我关闭时,我从操作系统(Windows XP)得到一个问题,在我的程序中有一个未处理的win32异常,因此是否要调试。这里的代码

#include<QApplication> 
#include<QMainWindow> 
#include<QWidget> 
#include<QMenu> 
#include<QMenuBar> 
#include<QPainter> 
#include<QFrame> 
#include<QHBoxLayout> 
#include<QScrollBar> 
#include<QLabel> 
#include<QScrollArea> 
#include<QListWidgetItem> 
#include<QByteArray> 
#include<QDataStream> 
#include<QMimeData> 
#include<QDrag> 
#include<QMouseEvent> 

#include<iostream> 

using namespace std; 

class MyWindow:public QMainWindow 
{ 
public: 
MyWindow(); 
}; 

class MyWidget:public QWidget 
{ 
QPixmap picture; 
QPixmap temp; 
public: 
MyWidget(); 
void paintEvent(QPaintEvent * event); 
void mousePressEvent(QMouseEvent * mouse); 
void dragEnterEvent(QDragEnterEvent * dragEnterEvent); 
void dragLeaveEvent(QDragLeaveEvent * event); 
void dragMoveEvent(QDragMoveEvent * event); 
void dropEvent(QDropEvent * event); 
}; 

int main(int argc,char *argv[]) 
{ 
Q_INIT_RESOURCE(puzzle); 

QApplication app(argc,argv); 

MyWindow mainWindow; 

mainWindow.show(); 

return app.exec(); 
} 

MyWindow::MyWindow():QMainWindow() 
{ 
setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding)); 

QMenu * fileMenu=menuBar()->addMenu(QObject::tr("Options")); 

QAction * restartAction = fileMenu->addAction(tr("NewGame")); 

QAction * exitAction = fileMenu->addAction(tr("Exit")); 
exitAction->setShortcuts(QKeySequence::Quit); 

QWidget * tempWidget=new MyWidget(); 
QFrame * newFrame=new QFrame(); 
QHBoxLayout * horizontal= new QHBoxLayout(newFrame); 

horizontal->addWidget(tempWidget); 
setCentralWidget(newFrame); 
} 

MyWidget::MyWidget():QWidget() 
{ 
setMinimumSize(10,10); 
setMaximumSize(1000,1000); 
} 

void MyWidget::dragEnterEvent(QDragEnterEvent * dragEnterEvent) 
{ 
if(dragEnterEvent->mimeData()->hasFormat("chess")) 
    dragEnterEvent->accept(); 
else 
    dragEnterEvent->ignore(); 
} 

void MyWidget::dragLeaveEvent(QDragLeaveEvent *event) 
{ 
update(QRect(0,0,picture.width(),picture.height())); 
event->accept(); 
} 

void MyWidget::dragMoveEvent(QDragMoveEvent *event) 
{ 
if(event->mimeData()->hasFormat("chess")) 
{ 
    event->setDropAction(Qt::MoveAction); 
    event->accept(); 
} 

else 
    event->ignore(); 

update(QRect(0,0,picture.width(),picture.height())); 
} 

void MyWidget::dropEvent(QDropEvent *event) 
{ 
if(event->mimeData()->hasFormat("chess")) 
{ 
    event->setDropAction(Qt::MoveAction); 
    event->accept(); 
} 

else 
    event->ignore(); 

update(QRect(0,0,picture.width(),picture.height())); 
} 

void MyWidget::paintEvent(QPaintEvent * event) 
{ 
QPainter painter; 
painter.begin(this); 
    picture=QPixmap("C:\\Board").scaled(600,600,Qt::KeepAspectRatioByExpanding,Qt::SmoothTransformation); 
setFixedSize(picture.size()); 
painter.drawPixmap(0,0,picture.height(),picture.width(),picture); 
temp=QPixmap("C:\\blackElephant").scaled(60,30,Qt::IgnoreAspectRatio,Qt::SmoothTransformation); 
painter.drawPixmap(0,0,temp.height(),temp.width(),temp); 
painter.end(); 
} 

void MyWidget::mousePressEvent(QMouseEvent * mouse) 
{ 
QByteArray array; 
QDataStream stream(&array,QIODevice::WriteOnly); 
stream << temp; 

QMimeData mimeData; 
mimeData.setData("chess",array); 

QDrag * newDrag=new QDrag(this); 

newDrag->setMimeData(&mimeData); 
newDrag->setHotSpot(mouse->pos()); 
newDrag->setPixmap(temp); 
update(QRect(0,0,picture.width(),picture.height())); 
} 

任何帮助将不胜感激。

回答

2

看一看的QGraphicsView,它给你一个帆布把项目上,甚至可以做动画。应该让事情比手工绘制像素图更容易。

+0

@prabhakaran QGraphicsView是完美的你想要完成的,QGraphicsItem也有适当的手柄点击和选择 – 2010-05-19 17:53:30

+0

@Harald Scheirich \ n 我看到那QGraphicsView,但我找不到任何方法直接添加一个像素图。 以及如何刷新屏幕。如果可以的话,你可以把一些基本的代码放在下面。因为我现在很沮丧,并且运行的时间 派生类:从QGraphicsScene (前TOM)然后定义如下 提前()函数//这将被调用刷新 等... – prabhakaran 2010-05-20 13:08:04

+0

请参阅更新 – prabhakaran 2010-06-15 09:38:48

2

对于拖放操作,您必须使用QDrag类(有关详细信息,请检查Qt examples on drag)。 QDrag类有一个名为pixmappixmap(),setPixmap())的属性,可用于设置与拖动操作关联的图像。

+0

@给所有 首先我想完成我的项目,通过使用Qt的图形用户界面将需要更少的时间。但是当我明白我必须在qt中尝试很多事情后,才决定首先完成逻辑部分。因此,每个机构请等待,直到我再次回到QT部分 – prabhakaran 2010-05-29 07:35:31

+0

请参阅更新 – prabhakaran 2010-06-15 09:42:21