QT鼠标键盘
一、鼠标拖放
拖放提供了一种用户在应用程序之间或之内传递信息的一种简单可视机制。拖放在功能上类似剪贴板的剪切和粘贴机制。拖放机制包括拖动、放下、剪贴板、拖放操作、添加新的拖放类型、高级拖放以及和其它应用程序之间的操作几个方面。下面从这几个方面分别进行说明:
(1)拖动
开始一个拖动,比如是在鼠标移动事件,创建一个适合你的媒体的QDragObject的子类的对象,例如:对于文本使用QTextDrag,对于图片使用QImageDrag。然后调用drag()方法。例如,从一个窗口部件中开始拖动一些文本:
void MyWidget::startDrag()
{
QDragObject *d = new QTextDrag( myHighlightedText(), this );
d->dragCopy();//拷贝选中文本
// 不要删除d。
}
在拖动之后,QDragObject没有被删除。在拖放明显完成后,这个QDragObject需要被保存。因为它还可能需要与其它进程通信。最后Qt会删除这个对象。如果拥有拖动对象的窗口部件在删除拖动对象之前被删除,那么任何没有完成的放下操作将会被取消,并且拖动对象会被删除。
(2)放下
为了能在一个窗口部件中接收被放下的媒体,这个窗口部件调用setAcceptDrops(TRUE)(如:在它的构造函数中),并且重载事件处理方法dragEnterEvent()和dropEvent()。对于更复杂的应用程序,重载dragMoveEvent()和dragLeaveEvent()也是必需的。
例如,当拖动后放下文本或图片时,窗口部件接受并处理放下操作的代码如下:
MyWidget::MyWidget(...) :
QWidget(...)
{
...
setAcceptDrops(TRUE); //接收被放下的媒体。
}
//当一个拖动正在进行并且鼠标进入这个窗口部件,这个事件处理函数被调用。
void MyWidget::dragEnterEvent(QDragEnterEvent* event)
{
event->accept( QTextDrag::canDecode(event) ||
QImageDrag::canDecode(event) );
}
//当拖动在这个窗口部件上被放下,这个事件处理器被调用。
void MyWidget::dropEvent(QDropEvent* event)
{
QImage image;
QString text;
if ( QImageDrag::decode(event, image) ) {//解码图片
insertImageAt(image, event->pos());//在窗口部件中插入图片
} else if ( QTextDrag::decode(event, text) ) {
insertTextAt(text, event->pos());
}
}
(3)剪贴板
QDragObject、QDragEnterEvent、QDragMoveEvent和QDropEvent类都是QMimeSource(提供类型信息的类)的子类。如果你在QDragObject中基于你的数据进行传递,你不仅可使用拖放,而且还可以使用传统的剪切和粘贴。 QClipboard有两个函数:
setData(QMimeSource*)
QMimeSource* data()const
使用这些函数,可以把拖放初始信息放到剪贴板中:
void MyWidget::copy()
{
QApplication::clipboard()->setData( new QTe