Bonjour,

J'ai implémenté les fonctions couper, copier, coller, undo pour un qtablewidget.
Je stocke les items dans une structure pour pouvoir les restaurer en cas d'annulation. La fonction copier stocke les données et dans la structure et dans un QClipboard de façon à être dispo pour une autre appli, quand on colle dans une autre appli, les cellules sont séparées par des tabulations et des retour chariots ( recopie des cellules opérationnelles dans openoffice par exemple )

Amélioration envisageable : plusieurs niveau d'annulation possible ( actuellement 1 seule opération peut être annulée ).

Limitation d'annulation :Si on fait un couper-coller, l'annulation restaure le contenu originel de la case ou le "coller" a été fait mais ne restaure pas la cellule ou a été fait le coller

Les critiques seront prises avec intérêt.

Voici mon code pour les personnes intéressés :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
 
typedef struct {
int 	position_x;
int 	position_y;
QTableWidgetItem* item;
} svg_item;
 
QList<QTableWidgetItem*> presse_papier;
QList<svg_item*> presse_papier_copie;
QList<svg_item*> presse_papier_svg;
 
 
void undo()
{
QTableWidgetItem* item;
int	pos_x,pos_y;
 
	for (boucle=0;boucle<presse_papier_svg.count();boucle++)
	{
	  item=presse_papier_svg.at(boucle)->item;
	  pos_x=presse_papier_svg.at(boucle)->position_x;
	  pos_y=presse_papier_svg.at(boucle)->position_y;
	  if (tableau->item(pos_x,pos_y)!=NULL) delete tableau->item(pos_x,pos_y);
	  tableau->setItem(pos_x,pos_y,item);
	}
	presse_papier_svg.clear();	
}
 
void copier()
{
QTableWidgetItem* item;
QModelIndexList presse_papier2;
svg_item* copie;
QString   clip;
int	boucle2;
	if (presse_papier_copie.count())
	{
	  presse_papier_copie.clear();
	}
	QModelIndexList i=tableau->selectionModel()->selectedIndexes();
	qSort(i.begin(),i.end());
	for (boucle=0;boucle<i.count();boucle++)
	{
	  copie=new svg_item;
	  if (i.at(boucle).data().toString()=="")
	  {
	    item=new QTableWidgetItem;
	  }
	  else
	  {
	    item=tableau->item(i.at(boucle).row(),i.at(boucle).column())->clone();
	  }
	  copie->item=item;
	  copie->position_x=i.at(boucle).row();
	  copie->position_y=i.at(boucle).column();
	  presse_papier_copie.append(copie);
	  clip.append(item->text());
	  boucle2=i.count();
	  boucle2--;
	  if (boucle<boucle2)
	  {
	    if (i.at(boucle+1).row()>i.at(boucle).row()) {clip.append("\n");}
	    else {if (i.at(boucle+1).column()>i.at(boucle).column()) clip.append("\t");}
	  }
	}
	QClipboard *clipboard=QApplication::clipboard();
	clipboard->setText(clip);
}
 
void coller()
{
QTableWidgetItem* item;
svg_item* copie;
int	new_pos_x,new_pos_y;
 
	if (presse_papier_copie.count()>0)
	{
	  presse_papier_svg.clear();
	  for (boucle=0;boucle<presse_papier_copie.count();boucle++)
	  {
	    copie=presse_papier_copie.at(boucle);
	    item=copie->item->clone();
	    new_pos_x=tableau->currentRow()+presse_papier_copie.at(boucle)->position_x-presse_papier_copie.at(0)->position_x;
	    new_pos_y=tableau->currentColumn()+presse_papier_copie.at(boucle)->position_y-presse_papier_copie.at(0)->position_y;
    	    copie=new svg_item;
	    copie->item=tableau->item(new_pos_x,new_pos_y);
	    copie->position_x=new_pos_x;
	    copie->position_y=new_pos_y;
	    presse_papier_svg.append(copie);
	    delete tableau->item(new_pos_x,new_pos_y);
	    tableau->setItem(new_pos_x,new_pos_y,item);
	  }
	  doc_modifie=TRUE;
	}
}
 
void couper()
{
QTableWidgetItem* item;
QModelIndexList presse_papier2;
svg_item* copie;
QString   clip;
int	boucle2;
 
	if (presse_papier_copie.count()) presse_papier_copie.clear();
	presse_papier_svg.clear();
	QModelIndexList i=tableau->selectionModel()->selectedIndexes();
	qSort(i.begin(),i.end());
	for (boucle=0;boucle<i.count();boucle++)
	{
	  copie=new svg_item;
	  if (i.at(boucle).data().toString()=="")
	  {
	    item=new QTableWidgetItem;
	  }
	  else
	  {
	    item=tableau->item(i.at(boucle).row(),i.at(boucle).column())->clone();
	  }
	  copie->item=item;
	  copie->position_x=i.at(boucle).row();
	  copie->position_y=i.at(boucle).column();
	  presse_papier_copie.append(copie);
	  presse_papier_svg.append(copie);
	  clip.append(item->text());
	  tableau->item(i.at(boucle).row(),i.at(boucle).column())->setText("");
	  boucle2=i.count();
	  boucle2--;
	  if (boucle<boucle2)
	  {
	    if (i.at(boucle+1).row()>i.at(boucle).row()) {clip.append("\n");}
	    else {if (i.at(boucle+1).column()>i.at(boucle).column()) clip.append("\t");}
	  }
	}
	QClipboard *clipboard=QApplication::clipboard();
	clipboard->setText(clip);
	doc_modifie=TRUE;
}