Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2405021
  • 博文数量: 862
  • 博客积分: 14125
  • 博客等级: 上将
  • 技术积分: 10598
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-27 16:53
个人简介

https://github.com/zytc2009/BigTeam_learning

文章分类

全部博文(862)

文章存档

2019年(3)

2018年(1)

2017年(10)

2015年(3)

2014年(8)

2013年(3)

2012年(69)

2011年(103)

2010年(357)

2009年(283)

2008年(22)

分类: C/C++

2009-07-25 13:38:48

 
以下整理来自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.释放窗口资源
  1). 对于使用指针,使用new创建的窗口,可以使用delete显示的释放其占用的资源:
    Widget *w = new Widget();
    delete w;

  2). 对于使用指针,使用new创建的窗口,还可以使用QWidget::setAttribute方法来当窗口关闭后自动释放其占用的资源,而不用户显式的去调用delete释放:
   Widget *w = new Widget();
   w->setAttribute(Qt::WA_DeleteOnClose);
这可以用于非模态对话框,因为非模态对话框如果是用指针形式创建,但是再接着delete的话,窗口就没了,如果不使用delete释放窗口占用的资源,又会造成泄漏。如果使用普通变量创建,同样的也因为变量作用域马上就结束而窗口也没了,另一种方法就是使用多线程,不过这个的代价大了点。所以这种技术在创建非模态对话框上是非常典型的运用。
测试方式:在Widget中分配大量的内存,显示与关闭多个此类窗口,看看任务管理器里此程序的内存变化情况,是否真正的释放了占用的内存(当然释放了)。在C++中使用new分配内存时,如array = new double[length],此时,给array的内存实际上并没有真正的分配,必须等到第一次使用这些内存后才会真正地为其分配物理内存,如:memset(array, 1, length * sizeof(double))

  3). 窗口的内存管理交给父Widget:
Widget *w = new Widget(parent);
但这时,如果父Widget不结束,这个窗口的资源一直会占用着。
至于使用哪种技术来释放窗口的资源,要看具体的运用时,哪种方式更合适。  
阅读(904) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~