• 7617阅读
  • 11回复

Qlistview双击打不开slot [复制链接]

上一主题 下一主题
离线潇湘书笛
 
只看楼主 倒序阅读 楼主  发表于: 2010-05-19
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
QDirModel * model = new QDirModel(this);
....
QListview * lv = new QListview;
....
connect(lv,SIGNAL(doubleClicked(const QModelIndex &)),this,SLOT(on_doubleClicked(const QModelIndex &)));

void on_doubleClicked(const QModelIndex & index)
{
QModelIndex index = lv->currentIndex();
    
    if(index.isValid())
    return;    

    lv->edit(index);
    lv->update(index);    

    if(model->isDir(index))
    {
        lv->setRootIndex(index);
    }
    else
    {
        QString str = model->filePath(index);
        QFile f("./qt.txt");
        f.open( QIODevice::WriteOnly);
        QTextStream s( &f );
        s << str << endl;
                f.close();
}
    目的是实现双击 将index文件路径输出到当前目录下的qt.txt文件中,可是我双击却不起作用阿? 貌似好像是index的问题吧
离线pear_2268

只看该作者 1楼 发表于: 2010-05-19
貌似槽函数写的不对吧,参数index已经是通过信号传值过来了,应该是那么写吧:
QString filePath = modelList->filePath(index);
QFileInfo fileInfo = modelList->fileInfo(index);
    if(fileInfo.isDir())
    {

    }
离线潇湘书笛
只看该作者 2楼 发表于: 2010-05-19
引用第1楼pear_2268于2010-05-19 10:31发表的  :
貌似槽函数写的不对吧,参数index已经是通过信号传值过来了,应该是那么写吧:
QString filePath = modelList->filePath(index);
QFileInfo fileInfo = modelList->fileInfo(index);
    if(fileInfo.isDir())
    {
.......


我用gdb调试了一下有问题:
[Thread debugging using libthread_db enabled]

Program received signal SIGSEGV, Segmentation fault.
0x00826bb6 in QAbstractItemModelPrivate::indexValid (this=0x670066, index=...)
    at ../../include/QtCore/private/../../../src/corelib/kernel/qabstractitemmodel_p.h:102
102    ../../include/QtCore/private/../../../src/corelib/kernel/qabstractitemmodel_p.h: 没有该文件或目录.
    in ../../include/QtCore/private/../../../src/corelib/kernel/qabstractitemmodel_p.h
Current language:  auto
The current source language is "auto; currently c++".
(gdb)
离线潇湘书笛
只看该作者 3楼 发表于: 2010-05-19
我将void file:: on_doubleClicked(const QModelIndex & index) 的index去掉(即变为void file:: on_doubleClicked(const QModelIndex & ))试了一下,gdb调试信息变了:

Program received signal SIGSEGV, Segmentation fault.
0x007c0920 in QPointer<QItemSelectionModel>::operator QItemSelectionModel* (
    this=0x63006d)
    at ../../include/QtCore/../../src/corelib/kernel/qpointer.h:78
78    ../../include/QtCore/../../src/corelib/kernel/qpointer.h: 没有该文件或目录.
    in ../../include/QtCore/../../src/corelib/kernel/qpointer.h
Current language:  auto
The current source language is "auto; currently c++".
离线foxyz

只看该作者 4楼 发表于: 2010-05-19
QDirModel * model = new QDirModel(this);
....
QListview * lv = new QListview;

lv->setModel(model); //这个得加上吧?
....
connect(lv,SIGNAL(doubleClicked(const QModelIndex &)),this,SLOT(on_doubleClicked(const QModelIndex &)));

void on_doubleClicked(const QModelIndex & index)
{
//QModelIndex index = lv->currentIndex();   这里是多此一举, 函数的参数已经传进来了,更何况你真要自己去取,名字也不能跟传入参数一样阿,重名了。

    
    if(index.isValid())  //这个逻辑有问题,为什么有效地Index还要返回呢? 改成if(!index.isValid())
        return;    

    //下边两句也是莫名其妙
    //lv->edit(index);
    //lv->update(index);    

    if(model->isDir(index))
    {
        lv->setRootIndex(index);
    }
    else
    {
        QString str = model->filePath(index);
        QFile f("./qt.txt");
        f.open( QIODevice::WriteOnly);
        QTextStream s( &f );
        s << str << endl;
                f.close();
}
    目的是实现双击 将index文件路径输出到当前目录下的qt.txt文件中,可是我双击却不起作用阿? 貌似好像是index的问题吧
离线潇湘书笛
只看该作者 5楼 发表于: 2010-05-19
引用第4楼foxyz于2010-05-19 13:35发表的  :
QDirModel * model = new QDirModel(this);
....
QListview * lv = new QListview;
lv->setModel(model); //这个得加上吧?
.......


参照仁兄的意见,我已经改过了但是调试的时候仍然出现:
Program received signal SIGSEGV, Segmentation fault.
0x00826bb6 in QAbstractItemModelPrivate::indexValid (this=0x670066, index=...)
    at ../../include/QtCore/private/../../../src/corelib/kernel/qabstractitemmodel_p.h:102
102    ../../include/QtCore/private/../../../src/corelib/kernel/qabstractitemmodel_p.h: 没有该文件或目录.
    in ../../include/QtCore/private/../../../src/corelib/kernel/qabstractitemmodel_p.h
Current language:  auto
The current source language is "auto; currently c++".
(gdb)
离线foxyz

只看该作者 6楼 发表于: 2010-05-19
Segmentation fault 一般出现在访问一个非法地址. 你最好把头文件和cpp文件都贴出来。才好看出是啥原因。不清楚你的平台是什么。如果是unix可以用dbx来调试
离线foxyz

只看该作者 7楼 发表于: 2010-05-19
还有,每次编译前最好clean一下! 否则moc*.cpp和ui_*.h等文件也会引来错误
离线潇湘书笛
只看该作者 8楼 发表于: 2010-05-19
我又试了一下,将代码改为:
if(model->isDir(index))
    {
        lv->setRootIndex(index);
    }
    else
    {
       QMessageBox::information(this,tr("Mplayer"),tr("Failed to open %1").arg(model->filePath(index)));
   }
问题依旧阿
Program received signal SIGSEGV, Segmentation fault.
0x00826bb6 in QAbstractItemModelPrivate::indexValid (this=0x670066, index=...)
    at ../../include/QtCore/private/../../../src/corelib/kernel/qabstractitemmodel_p.h:102
102    ../../include/QtCore/private/../../../src/corelib/kernel/qabstractitemmodel_p.h: 没有该文件或目录.
    in ../../include/QtCore/private/../../../src/corelib/kernel/qabstractitemmodel_p.h
Current language:  auto
The current source language is "auto; currently c++".
(gdb)

由此大概可以说明 index参数没有传进来
离线潇湘书笛
只看该作者 9楼 发表于: 2010-05-19
引用第6楼foxyz于2010-05-19 13:56发表的  :
Segmentation fault 一般出现在访问一个非法地址. 你最好把头文件和cpp文件都贴出来。才好看出是啥原因。不清楚你的平台是什么。如果是unix可以用dbx来调试



我用的是linux ubuntu 9.10
我之前用的model是QFileSystemModel,在主机上运行良好,但是一移植到mini2440开发板上就提示出错了,所以只能用QDirModel  了

qmake -project
qmake
make
编译可以通过,就是出现段错误
make clean
离线潇湘书笛
只看该作者 10楼 发表于: 2010-05-19
我没有弄UI界面,纯指令搭建
现在的问题是不清楚 QModelIndex index 如何传递参数呢?
离线潇湘书笛
只看该作者 11楼 发表于: 2010-05-20
问题已解决
快速回复
限100 字节
 
上一个 下一个