2010-05-19 14 views
1

J'essaie de faire une partie d'échecs. Donc, je veux déplacer l'image pièce de monnaie d'échecs lorsque l'utilisateur clique et tire la pièce. Quelle classe je dois utiliserQt- comment déplacer une image à l'écran en fonction du mouvement de la souris

mise à jour

Enfin, je suis simplement éditer le code de puzzle qui est donné en glisser-déposer des exemples. Par là j'essaie de connaître les fonctions. Mais je n'obtiens toujours pas certaines choses. J'exécute le code ci-dessous mais l'image ne bouge pas. Et quand je ferme je reçois une question de l'OS (Windows XP), qu'il y a une exception win32 non gérée dans mon programme, donc si vous voulez déboguer ou pas. Ici le code

#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())); 
} 

toute aide sera appréciée.

Répondre

2

Jetez un oeil à QGraphicsView, il vous donne une toile pour mettre des éléments, et peut même faire des animations. Cela devrait rendre les choses beaucoup plus faciles que de peindre des pixmaps à la main.

+0

QGraphicsView @prabhakaran est parfait pour ce que vous essayez d'accomplir, QGraphicsItem a aussi des poignées appropriées pour cliquer et sélection –

+0

@Harald Scheirich \ n j'ai vu QGraphicsView, mais je ne trouve aucun moyen d'y ajouter directement un pixmap. Et comment actualiser l'écran. Si vous le pouvez, pouvez-vous s'il vous plaît mettre un code de base comme ci-dessous. Parce que je suis frustré maintenant, et manquer de temps dérivez une classe (ex: tom) de QGraphicsScene Définissez ensuite les fonctions ci-dessous avance() // Ce sera appelé pour le rafraîchissement etc ... – prabhakaran

+0

s'il vous plaît voir le mise à jour – prabhakaran

2

Pour le glisser-déposer, vous devez utiliser la classe QDrag (vérifiez Qt examples on drag pour plus de détails). La classe QDrag a une propriété appelée pixmap (pixmap(), setPixmap()) qui peut être utilisée pour définir l'image associée à l'opération de glissement.

+0

@ à tous D'abord j'ai pensé compléter l'interface graphique de mon projet à travers qt prendra moins de temps. Mais après avoir compris que je devais expérimenter beaucoup de choses en qt, j'ai décidé de terminer la partie logique en premier. Ainsi, chaque corps s'il vous plaît attendre jusqu'à ce que je reviens à nouveau à une partie qt – prabhakaran

+0

s'il vous plaît voir la mise à jour – prabhakaran

Questions connexes