首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

Qt有关问题 0xC0000005: 读取位置 0x08010000 时发生访问冲突

2012-05-16 
Qt问题 0xC0000005: 读取位置 0x08010000 时发生访问冲突头文件:findfileform.h#ifndef FINDFILEFORM_H#de

Qt问题 0xC0000005: 读取位置 0x08010000 时发生访问冲突
头文件: findfileform.h#ifndef FINDFILEFORM_H
#define FINDFILEFORM_H

#include <QtGui/QWidget>
#include "ui_findfileform.h"
#include <QDir>

class findfileform : public QWidget,public Ui_FindFileForm

{
Q_OBJECT

public:
findfileform(QWidget *parent = 0, Qt::WFlags flags = 0);
~findfileform();
private:
Ui::FindFileForm ui;
QStringList findFiles(const QDir&,const QString&,const QString&);//文件的查找并返回符合条件的文件列表
void showFiles(const QDir&,const QStringList&);
void tranvFolder(const QDir&,const QString&,const QString&);//递归函数,实现对文件的递归查找
bool m_bStoped;//判断用户是否点击了停止按钮,如果单击了为true,否则为false
bool m_bSubfolder;//子文件夹,选中true,否则false
bool m_bSensitive;//区分大小写,选中为true,否则为false
int m_nCount;//查找文件的个数

private slots:
void browse();//浏览browse
void find();
void stop();
void doTxtChange(const QString&);
};

#endif // FINDFILEFORM_H

实现文件: findfileform.cpp
#include "findfileform.h"
#include <QtGui>

findfileform::findfileform(QWidget *parent, Qt::WFlags flags)
: QWidget(parent, flags),m_bStoped(false),m_nCount(0)
{
ui.setupUi(this);
ui.statusLabel->setText(tr("就绪"));//左下角
ui.resultLabel->setText(tr("找到0个文件"));//右下角
ui.nameComboBox->setEditText("*");//名为后边的
ui.dirComboBox->setEditText(QDir::currentPath());//应用程序所在的目录的绝对路径
ui.dirComboBox->addItem(QDir::currentPath());
ui.sensitiveCheckBox->setEnabled(false);//区分大小写复选框的初始状态为不可用(灰色)
ui.stopPushBtn->setEnabled(false);//停止查找不可用


connect(findPushBtn,SIGNAL(clicked()),this,SLOT(find()));
connect(stopPushBtn,SIGNAL(clicked()),this,SLOT(find()));
connect(closePushBtn,SIGNAL(clicked()),this,SLOT(find()));
connect(browsePushButton,SIGNAL(clicked()),this,SLOT(find()));
connect(txtLineEdit,SIGNAL(textChanged(const QString &)),this,SLOT(doTxtChange(const QString &)));
}

void findfileform::browse()//实现预览功能
{//QFileDialog类提供了允许用户选择文件或者目录的对话框。
QString dir=QFileDialog::getExistingDirectory(this,tr("选择查找路径"),QDir::currentPath(),QFileDialog::ShowDirsOnly);
//QFileDialog::getExistingDirectory 打开一个文件对话框,返回用户选择的文件系统中存在的路径
//QDir::currentPath 获取应用程序所在的路径,初始化为文件对话框的当前目录,current当前的
//QFileDialog::ShowDirsOnly指示文件对话框只显示目录
if (!dir.isEmpty())//返回路径非空执行
{
dirComboBox->addItem(dir);//添加到查找位置下拉框
dirComboBox->setCurrentIndex(dirComboBox->currentIndex()+1);
}
}


void findfileform::find()//实现查找功能
{
frame->setEnabled(false);
//容器frame不可用,其子窗口也不可以用,防止用户查找过程中再次输入,也是在设计的时候QFrame设计的主要作用
findPushBtn->setEnabled(false);//就是findPushBtn不可以用了
stopPushBtn->setEnabled(true);//find按钮不可以用的时候,stop按钮变的可以用,牛...
statusLabel->setText(tr("正在搜索..."));//最下角statusLabel显示
resultTableWidget->setRowCount(0);

QString fileName=nameComboBox->currentText();
QString txt=txtLineEdit->text();
QString path=dirComboBox->currentText();
m_bSubfolder=subfolderCheckBox->isChecked();//包含目录那个subfolderCheckBox可以点击
m_bSensitive=sensitiveCheckBox->isChecked();//区分大小写那个sensitiveCheckBox可以点击

m_nCount=0;
m_bStoped=false;
QDir dir=QDir(path);
if (fileName.isEmpty())
fileName="*";
tranvFolder(dir,fileName,txt);

if(m_bStoped)
statusLabel->setText(tr("已中止"));
else
statusLabel->setText(tr("就绪"));
findPushBtn->setEnabled(true);
stopPushBtn->setEnabled(false);
frame->setEnabled(true);
}

void findfileform::tranvFolder(const QDir& dir,const QString& fileName,const QString& txt)
{
if (m_bSubfolder)
{


QStringList folders;
folders=dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
//获得当前路径下的文件夹,获得的文件夹列表中不包含"."(当前目录)和".."(当前目录的上一级目录)目录
for (int i=0;i<folders.size();++i)
{
qApp->processEvents();//事件处理函数,在查找的过程当成也能响应用户的停止查找,关闭操作.
if (m_bStoped)
break;
QString strDir=QString("%1/%2").arg(dir.absolutePath()).arg(folders[i]);
tranvFolder(strDir,fileName,txt);
}
}
QStringList files=findFiles(dir,fileName,txt);
showFiles(dir,files);
m_nCount +=files.size();
resultLabel->setText(tr("找到%1个文件").arg(m_nCount));
}

QStringList findfileform::findFiles(const QDir& dir,const QString& fileName,const QString& txt)
{
//entryList获取给定文件名的文件列表.两个实参,一个是文件名字过滤器,另一个是QDir::Files只获取当前目录下的文件的名字
//QDir::NoSymLinks表面返回的文件名列表不含系统的符号链接.
QStringList files=dir.entryList(QStringList(fileName),QDir::Files | QDir::NoSymLinks);
if (txt.isEmpty())
return files;
QStringList foundFiles;
Qt::CaseSensitivity sensitive=Qt::CaseInsensitive;//不灵敏
if(m_bSensitive)
sensitive=Qt::CaseSensitive;//灵敏

for (int i=0;i<files.size();++i)
{
qApp->processEvents();
if(m_bStoped)
break;

QFile file(dir.absoluteFilePath(files[i]));//返回当前目录下的一个文件的绝对路径名
if (file.open(QIODevice::ReadOnly))//只读的方式打开文件
{
QString line;
QTextStream in(&file);//栈对象,提供了对文本进行读写操作
while (!in.atEnd())
{
if(m_bStoped)
break;
line=in.readLine();
if (line.contains(txt,sensitive))//进行文本的包含判断,直到atEnd判断已经到了文件尾
{
foundFiles<<files[i];
break;
}
}
}
}
return foundFiles;
}

void findfileform::showFiles(const QDir& dir,const QStringList& files)
{
for (int i=0;i<files.size();++i)
{
QString strFilePath=dir.absoluteFilePath(files[i]);
QFile file(strFilePath);
QFileInfo fileInfo(file);
qint64 size=fileInfo.size();
QDateTime dataTime=fileInfo.created();
QString strDateTime=dataTime.toString(tr("yyyy MM月 dd日 hh:mm"));
QString strPermission;
if(fileInfo.isWritable())
strPermission.append("w");
if(fileInfo.isReadable())
strPermission.append("r");//附加
if(fileInfo.isExecutable());
strPermission.append("x");

QTableWidgetItem *fileNameItem=new QTableWidgetItem(strFilePath);
fileNameItem->setFlags(Qt::ItemIsEnabled);//arg自变量
QTableWidgetItem *sizeItem=new QTableWidgetItem(tr("%1 KB").arg(int((size+1023)/1024)));
sizeItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);//又对齐,垂直居中
sizeItem->setFlags(Qt::ItemIsEnabled);
QTableWidgetItem *createdItem=new QTableWidgetItem(strDateTime);
QTableWidgetItem *permissionItem=new QTableWidgetItem(strPermission);

int row=resultTableWidget->rowCount();
resultTableWidget->insertRow(row);
resultTableWidget->setItem(row,0,fileNameItem);
resultTableWidget->setItem(row,1,sizeItem);
resultTableWidget->setItem(row,2,createdItem);
resultTableWidget->setItem(row,3,permissionItem);
}
}

void findfileform::stop()
{
m_bStoped=true;
}

void findfileform::doTxtChange(const QString& txt)
{
if(txt.isEmpty())
sensitiveCheckBox->setEnabled(false);
else
sensitiveCheckBox->setEnabled(true);
}




findfileform::~findfileform()
{

}


主程序文件: .cpp
#include "findfileform.h"
#include <QtGui/QApplication>
#include <QtCore/QTextCodec>

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

QTextCodec::setCodecForTr(QTextCodec::codecForName("gb2312"));/*GB2312收录了6763个汉字


GBK收录了21003个汉字
GB18030-2000收录了27533个汉字
GB18030-2005收录了70244个汉字
Unicode 5.0收录了70217个汉字*/

Q_INIT_RESOURCE(findfileform);//初始初始化的。程序运行加载qrc


findfileform w;
w.show();
return a.exec();
}


还有一个findfileform.ui





最终出现错误如下:
findfileform.exe 中的 0x55a95556 (QtCored4.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x08010000 时发生访问冲突

请问各位大虾我该怎么修改呢? 谢谢~

[解决办法]
不如将工程上传上来吧?
[解决办法]
晕到死下面的,不会

热点排行