2010.02.21
今天在shell下用qmake来编译程序,老是出现以下一大窜错误
hello.c:9: error: expected ‘{’ at end of input
但是用qtcreate写的程序编译却没有问题,我当时以为是pro文件中的问题,但这个文件是qmake自动生成的,改了之后也没有作用,在网上搜了以下也没有找到原因,最后发现,原来我建立的源文件是.c文件,而qtcreate建立的是.cpp文件,我将我的.c文件改为.cpp后就能正确的编译了。
2010.2.23
Q_OBJECT宏的作用:启动Qt元对象系统的一些特性(比如支持信号和槽等),它必须被放在类定义的私有区。
头文件中类似class QLineEdit;之类的传递声明,作用是告诉编译器,QLineEdit类已经存在。好处有:减少头文件的大小,增加编译速度(特别是当该头文件被其他文件多次包含引用时);这样做可避免因包含头文件的顺序不当而造成连接错误。
QLineEdit行编辑框标签对象显示方式如下:通过SetEchoMode()设置显示方式,
QLineEdit::Normal默认的显示方式,显示用户实际输入的内容。
QLineEdit::Password用星号“*”代替用户实际输入的内容;
QLineEdit::NoEcho不显示用户输入的字符,尽管QLineEdit::PassWord可以有效地起到密码保护的作用,但它仍显示了用户输入字符的个数,而QLineEdit::NoEcho对显示的内容采取了更进一步的保密措施。
QLineEdit::PasswordEchoOnEdit;仅仅用户在行编辑框里编辑文本的内容时,才显示用户输入的字符,而在用户完成编辑后以星号代替输入的内容。
QGridLayout:网格布局管理器
QHBoxLayout:水平布局管理器
QVBoxLayout:垂直布局管理器
QLineEdit::text()返回行编辑框中文本内容,返回QString的字符窜。
QString::trimmed()移出了字符窜中开头和结尾的空白字符,并返回移出空白字符后的字符窜。这些空白字符包括ASCII字符"/t","/n","/v","/f","/r"和空格" ".
QMessage用法:
QMessageBox::warning()将创建并显示一个模态的警告对话框。
QMessageBox::about,一个带有标题和简单文本的消息框。
QMessageBox::aboutQt,显示qt的消息框,qt版本等信息。
QMessageBox::information,一个具有主题和提示文本的提示消息框
QMessageBox::question:一个具有标题和文本信息的询问消息框。
QMessageBox::critical:一个具有遍体和文本信息的致命错误消息框。
qt对话框的高级应用程序
#include<QtGui/QtGui>
#include<QtGui/QApplication>
#include<QMessageBox>
int main(int argc,char * argv[])
{
QApplication app(argc,argv);
QWidget * pWidget=new QWidget;
QMessageBox box;
box.setWindowTitle(QObject::tr("Warning"));
box.setIcon(QMessageBox::Warning);
box.setText(QObject::tr("Error,yes or no"));
box.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
box.setDetailedText(QObject::tr("error infomation"));
switch(box.exec())
{
case QMessageBox::Yes:
QMessageBox::warning(pWidget,QObject::tr("warning"),QObject::tr("YES"),QMessageBox::Yes);
break;
case QMessageBox::No:
QMessageBox::warning(pWidget,QObject::tr("warning"),QObject::tr("NO"),QMessageBox::No);
break;
default:
break;
}
return app.exec();
}
qt中,QDialog::exec()以模态方式显示对话框,而QDialog::show()默认以非模态方式显示对话框。
进度对话框:
QProgressDialog progress(tr("copying file..."),
tr("cancel"),0,10000,this);
//第一个参数是字符窜,显示信息,第二个参数指定“取消”按钮显示的文本,如果参数为0,则没有取消按钮。
progress.setWindowModality(Qt::WindowModal);
//模态方式显示对话框,用qApplication::processEvents()函数来保证事件循环中还可以处理其他事情,通过QProgressDialog::setValue()函数推进显示的进度,通过QProgressDialog::wasCancled()函数判度用户是否选择了取消按钮,通过qDebug()函数打印进度
progress.setWindowTitle(tr("progress Dialg"));
progress.show();
for(int i=0;i<10000;i++){
progress.setValue(i);
qApp->processEvents();
if(progress.wasCanceled())
break;
qDebug()<<i;
}
progress.setValue(10000);
QWidget:
在控制台执行uic命令,可以把ui文件编译出.h文件,如:
uic -o ui_findfileform.h findfileform.ui 或者
uic findfileform.ui(直接输出到控制台)
浏览文件对话框:
QFileDialog::getExistingDirectory(this,
tr("chose directory"),QDir::currentPath(),
QFileDialog::ShowDirsOnly);
该函数打开一个文件对话框,返回路径,QDir::currentPath()获取应用程序路径,并初始化为对话框的当前目录。QFile::ShowDirsOnly指示对话框之显示目录。
递归查找文件
void CFindFileForm::tranvFolder(const QDir & dir,const QString & filename,
const QString txt)
{
if(m_bSubfolder)//判度是否包含子目录
{
QStringList folders;
folders=dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
//该函数获取但前文件夹目录下的所有自文件夹的列表保存在QStringList中,函数的参数指定过滤器,QDir::Dir表示之获取当前路径下的文件夹;QDir::NoDotAndDotDot表示获取的文件夹列表中不包含"."(当前目录)和".."(当前目录的上一级目录)目录。调用QApplication::processEvents()事件处理,以便应用程序即使在查找过程中也能够响应用户的"停止查找"或"关闭"操作。
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();
label_6->setText(tr("find %1 files").arg(m_nCount));
}
QStringList CFindFileForm::findFiles(const QDir &dir,
const QString & fileName,const QString & txt)
{
QStringList files=dir.entryList(QStringList(fileName),
QDir::Files | QDir::NoSymLinks);
//QDir::entryList(),第一个参数是QStringList类型的列表,指定了一个文件名字过滤器,第二个参数指定了另一个过滤器,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]));
//QDir::absoluteFilePath()函数返回当前目录下一个文件的绝对目录
if(file.open(QIODevice::ReadOnly))
//QIODevice::ReadOnly参数指定了只读方式打开
{
QString line;
QTextStream in(&file);
//QTextStream提供文本进行读写的操作.
while(!in.atEnd())
{
if(m_bStoped) break;
line=in.readLine();
//QTextStream::readLine()对文件进行读入操作
if(line.contains(txt,sensitive))
//QString::contains()对文本包含进行判断,直到QTextSteam::atEnds()判断已经到了文件尾
{
foundFiles<<files[i];
break;
}
}
}
}
return foundFiles;
}
在QTableWidget中添加数据;
信号和槽自动关联
例如:将browsePushBtn按钮的槽函数void browse()的clicked()单击信号修改为on_browsePushBtn_clicked(),就不需要加入connect()进行显式的调用。