qt开发中遇到的问题整理五
1.请问可以在Qthread里面 操作 ui控件吗?
不可以。 文档原文: In GUI applications, the main thread is also called the GUI thread because it's the only thread that is allowed to perform GUI-related operations
所以只能通过信号和槽机制进行传递
2.QT4增加了一个非常有用的类QSettings
QSettings是qt4.0提供的一个读取配置文件的类,在windows平台,它提供了ini文件读些,注册表读写的功能。而且使用也非常简单。大家可以参照它的示例:$QTDIR\examples\tools\settingseditor
我就简单点随便介绍介绍它的使用吧
QSettings::Format有两种:
QSettings::NativeFormat在windows平台可以读写windows注册表.
QSettings::IniFormat可以读写ini格式的配置文件
在Unix/X11平台下这两个Format效果是一样的:(
1).读写注册表
//注意的就是路径名必须是"/"而不是"\\"等.否则不能读写,同时注意
//Format为QSettings::NativeFormat
QSettings *settings = new QSettings("HKEY_CURRENT_USER/", QSettings::NativeFormat);
//写HKEY_CURRENT_USER/regedit/test,设置test值为red
settings->setValue("regedit/test", "red");
//读 HKEY_CURRENT_USER/regedit/test,默认值是ddd
QString value = settings->value("regedit/test", "ddd").toString();
删除设置对应的是settings->remove( const QString & key )
2).读取ini配置文件
ini文件格式如下:
[Alpha]
Beta/Beta=1
Beta/Gamma=2
Beta/Delta=1111
Beta/Epsilon=5
Iota=7
Omicron=11
QSettings *settings = new QSettings(fileName, QSettings::IniFormat);
//写Beta/Beta
settings->setValue("Alpha/Beta/Beta", 68);
其他和读写注册表差不多,我就懒得写了
发觉QT4读写的这种配置,即可兼容windows下的ini文件,同时它的功能也比windows API所提供的功能强.
3.QTextEdit如何得到光标所在的行和列??
首先获取QTextEdit 的当前光标
const QTextCursor cursor = textEdit->textCursor();
然后
int ColNum = cursor.columnNumber();
int RowNum = cursor.blockCount();
这样就over了
4.隐藏滚动条:
一般有滚动条的控件都有setVerticalScrollBarPolicy和setHorizontalScrollBarPolicy函数,
只要设置为Qt::ScrollBarAlwaysOff就可以隐藏滚动条了,默认是Qt::ScrollBarAsNeeded需要时才出现。
5.用qt把数据写入Excel 中
用qt把数据写入Excel 中:
代码:
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),
"",
tr("file ( *.CSV)"));
if(fileName == "")
{
return;
}
QTextCodec *code;
code = QTextCodec::codecForName("gb18030");
std::string strbuffer = code->fromUnicode(fileName).data();
FILE *fileWrite = fopen( strbuffer.c_str(),"w");
QString strFemale = "Female Count";
QString strMale = "Male Count";
QString strPatientCount = "Patient Count";
QString str ="\n";
std::string strCountbuffer = code->fromUnicode(strFemale+","+strMale+","+strPatientCount+str+QString().setNum(femaleCount)+","+QString().setNum(maleCount)+","+QString().setNum(patientCount)).data();
QFile file;
file.open(fileWrite, QIODevice::WriteOnly);
file.write(strCountbuffer.c_str(), qstrlen(strCountbuffer.c_str()));
file.close();
6.linux下写文件乱码:
/* 往文本里写数据 */
QFile file("backup_file.txt");
if(file.open(QIODevice::ReadWrite))
{
QTextStream out(&file);
//设置编码用的codec
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
// 设置流的编码方式
out.setCodec(codec);
for( int i=0; i < 30; i++)
{
out << QString::number(i, 10) << "姓名" << endl;
}
}
解决方法:
//设置编码用的codec
// QTextCodec *codec = QTextCodec::codecForName("UTF-8");
// 设置流的编码方式
// out.setCodec(codec);
7.对话框去掉边框:
QWidget::QWidget ( QWidget * parent = 0, Qt::WindowFlags f = 0 ) 我们主要是继承Qwidget类时设置WindowFlags ,设置成Qt::CustomizeWindowHint或Qt::FramelessWindowHint,也可以用函数setWindowFlags进行设置
8.设置控件透明度:
setWindowOpacity可以设置控件透明度,0.0-1.0,0.0是完全透明,对于容器类控件,它的所有子部件也随之变透明
9.启动其他应用程序,比如打开浏览器,打开一个excel文件等:
openUrl函数可以打开不同类型的文件,程序,网址等,会启动系统默认打开工具进行打开,
openUrl ( const QUrl & url ) ;而QUrl以网址的形式设置一个文件全路径,进行打开。
如:QUrl url("http://www.example.com/List of holidays.xml");
QUrl url;
url.setUrl("F:/test/abc.chm");
10. 不要在switch、while,for里使用qprocess:
qprocess是多进程处理的,可能持续时间长,也可能会出异常,所以不要使用。在其他地方使用时,最好在start之后进行等待一段时间,waitforfinish