Qt-如何根据鼠标移动在屏幕上移动图片
我正在尝试做一个国际象棋游戏。所以我想在用户点击并拖动硬币时移动棋子图片。 我使用哪个类来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()));
}
任何帮助将不胜感激。
看一看的QGraphicsView,它给你一个帆布把项目上,甚至可以做动画。应该让事情比手工绘制像素图更容易。
对于拖放操作,您必须使用QDrag
类(有关详细信息,请检查Qt examples on drag)。 QDrag类有一个名为pixmap
(pixmap()
,setPixmap()
)的属性,可用于设置与拖动操作关联的图像。
@给所有 首先我想完成我的项目,通过使用Qt的图形用户界面将需要更少的时间。但是当我明白我必须在qt中尝试很多事情后,才决定首先完成逻辑部分。因此,每个机构请等待,直到我再次回到QT部分 – prabhakaran 2010-05-29 07:35:31
请参阅更新 – prabhakaran 2010-06-15 09:42:21
@prabhakaran QGraphicsView是完美的你想要完成的,QGraphicsItem也有适当的手柄点击和选择 – 2010-05-19 17:53:30
@Harald Scheirich \ n 我看到那QGraphicsView,但我找不到任何方法直接添加一个像素图。 以及如何刷新屏幕。如果可以的话,你可以把一些基本的代码放在下面。因为我现在很沮丧,并且运行的时间 派生类:从QGraphicsScene (前TOM)然后定义如下 提前()函数//这将被调用刷新 等... – prabhakaran 2010-05-20 13:08:04
请参阅更新 – prabhakaran 2010-06-15 09:38:48