Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QListWidget拖放项目从Symbian上的列表中消失_Qt_Drag And Drop_Symbian_Qlistwidget - Fatal编程技术网

Qt QListWidget拖放项目从Symbian上的列表中消失

Qt QListWidget拖放项目从Symbian上的列表中消失,qt,drag-and-drop,symbian,qlistwidget,Qt,Drag And Drop,Symbian,Qlistwidget,我在实现带有自定义项的QListWidget时遇到问题,这些自定义项可以通过拖放来重新排序。问题是,当我在一个项目上快速双击(非常短的拖放)时,该项目有时会从QListWidget中消失 这是我的小部件的构造函数: ListPopisiDragDrop::ListPopisiDragDrop(QWidget *parent) : QListWidget(parent) { setSelectionMode(QAbstractItemView::SingleSelection);

我在实现带有自定义项的QListWidget时遇到问题,这些自定义项可以通过拖放来重新排序。问题是,当我在一个项目上快速双击(非常短的拖放)时,该项目有时会从QListWidget中消失

这是我的小部件的构造函数:

ListPopisiDragDrop::ListPopisiDragDrop(QWidget *parent) :
    QListWidget(parent)
{
    setSelectionMode(QAbstractItemView::SingleSelection);
    setDragEnabled(true);
    viewport()->setAcceptDrops(true);
    setDefaultDropAction(Qt::MoveAction);
    setDropIndicatorShown(true);
    setDragDropMode(QAbstractItemView::InternalMove);
}
此外,drop事件:

void ListPopisiDragDrop::dropEvent(QDropEvent *event){

    int startRow=currentIndex().row();

    QListWidget::dropEvent(event);

    int endRow=currentIndex().row();

    //more code...
}
自定义项是通过从QAbstractItemDelegate实现paint()和sizeHint()函数来实现的

当项目消失的问题发生时,甚至不会调用dropEvent

我真的不知道发生了什么,也不知道我是否做错了什么。感谢您的帮助

谢谢

编辑: 我正在塞班S60第五版手机上运行该应用程序

编辑2: 如果我将此行添加到构造函数中:

setDragDropOverwriteMode(true);
列表中的项目仍然会消失,但会保留一个空行

编辑3: 我添加了以下代码以查看发生了什么:

bool ListPopisiDragDrop::event(QEvent *e){
    qDebug()<<"new event, type: "<<e->type()<<", listCount: "<<this->count();

    QListWidget::event(e);
}
如您所见,在事件类型68之后,listCount从2变为1(一项消失)。我还是不明白问题出在哪里

编辑4: 即使不使用自定义项,我也有相同的行为。还是不知道怎么回事

编辑5: 甚至[1]中的示例在移动设备上测试时也具有相同的行为。Qt版本会有问题吗?我正在为Symbian设备版本4.6.3使用Qt


[1]http://www.java2s.com/Code/Cpp/Qt/QListWidgetdraganddrop.htm

我能想到这种行为的两个原因:信号项DoubleClicked在QListWidget中的某个地方被处理,并执行一些不相关的操作,或者dropEvent中的“更多代码”在源和目标相同时执行一些不好的操作(您可以检查startRow是否等于endRow,在这种情况下不执行任何操作)

编辑:

该计划是否适用于您:

#include <QApplication>
#include <QListWidget>

int main(int argc, char **argv)
{
    QApplication a(argc, argv);

    QListWidget lw;

    for(int i = 1; i < 10; ++i)
        lw.addItem(new QListWidgetItem(QString("Item %1").arg(i)));
    lw.setDragEnabled(true); // ***
    lw.viewport()->setAcceptDrops(true); // ***
    lw.setDefaultDropAction(Qt::MoveAction); // ***
    lw.setDropIndicatorShown(true); // ***

    lw.setDragDropMode(QAbstractItemView::InternalMove);

    lw.show();

    a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()));
    a.exec();
}
#包括
#包括
int main(int argc,字符**argv)
{
质量保证申请a(argc、argv);
qlistlw;
对于(int i=1;i<10;++i)
lw.addItem(新的QListWidgetItem(QString(“项目%1”).arg(i));
lw.setDragEnabled(真);//***
lw.viewport()->setAcceptDrops(true);//***
lw.setDefaultDropAction(Qt::MoveAction);//***
lw.setDropIndicatorShown(真);//***
setDragDropMode(QAbstractItemView::InternalMove);
lw.show();
a、 连接(&a,信号(lastWindowClosed()),&a,插槽(quit());
a、 exec();
}

可以删除带有三星的行。此程序适用于我在Windows XP上使用的Qt 4.7.1,使用VS2010编译。

曾经在桌面上遇到过同样的问题,SelectionMode、InternalMove等,完全如图所示。该视图也有我自己的模型,所以我只是让它以这种方式返回:

Qt::ItemFlags MyModel::flags(const QModelIndex& index) const
{
    if (index.isValid())
        return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled;

    return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled;
}

我的工作很好。

谢谢你的回答。我正在处理itemDoubleClicked信号,但我不会在任何地方删除任何内容。此外,问题发生时不会调用itemDoubleClicked,dropEvent也不会触发。如果startRow和endRow相等,我甚至不会执行任何操作……我会在一分钟内用更多信息编辑我的问题。是的,不会他的程序在计算机上运行得很好,我的程序也一样,但在手机上运行时,它们都有这种奇怪的行为。我会尝试更新到Qt 4.7.1。你没有提到这个问题只是在手机上。也许你应该检查Qt错误跟踪器?键入68=ChildAdded,71=ChildRemoved,12=Paint,1=Timer
Qt::ItemFlags MyModel::flags(const QModelIndex& index) const
{
    if (index.isValid())
        return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDragEnabled;

    return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsDropEnabled;
}