zoukankan      html  css  js  c++  java
  • 转:Qt项目中遇到的一些小问题汇总

    链接:http://blog.csdn.net/yangyunfeizj/article/details/7082001    作者:GoatYangYang

    公司让负责qt界面开发,但是接触qt又不久,现将在项目中遇到的一些问题汇总下,一为了避免自己忘记,二希望能帮助到他人。

    1.在程序关闭窗口时,显示提示窗口:

           qt中有很多信号和相应的槽函数,上述问题需要拦截关闭窗口信息QWidget::close(),QWidget::closeEvent( QCloseEvent * event )重写,即对代码如下:

    [cpp] view plaincopy
     
    1. <span style="font-family:SimSun;font-size:13px;">void QWidget::closeEvent ( QCloseEvent * event )  
    2. {  
    3.     QMessageBox::StandardButton button;  
    4.     button = QMessageBox::question(this,tr("退出程序"),  
    5.         QString(tr("警告:程序正在运行中,是否结束操作退出?")),  
    6.         QMessageBox::Yes | QMessageBox::No);  
    7.     if(button == QMessageBox::No)  
    8.     {  
    9.         event->ignore();  
    10.     }  
    11.     else if(button == QMessageBox::Yes)  
    12.     {  
    13.         event->accept();  
    14.     }  
    15. }</span>  

    2.在程序中开辟线程,需要在程序结束前结束线程,如果在程序中动态开辟了内存,需要考虑内存释放问题:

          (1).开启线程, 如果程序中需要使用线程,可以通过自定义线程,继承QThread,重写QThread::run(),run()函数体内就是线程的执行过程,记得在函数最后加上事件循环QThread::exec(),再通过QThread::start()函数开启线程。

         (2).结束线程,先调用QThread::exit(),结束线程事件循环,再调用QThread::wait()来阻塞主程序知道线程结束运行。

         (3).内存释放问题,如果是在线程中开辟的动态内存,需要在线程结束前手动释该内存,可以在析构函数中调用delete来删除,再调用(2)中退出线程,这些可以在析构函数中实现。

              补充: qt中当parent销毁时,会自动delete child对象,而对于没有parent的对象需要手动释放。

    3.信号和槽问题:

           (1).信号是某个对象的信号,槽也是某个对象的槽,信号和槽通过QObject::connect()联系在一起,这个联系可以再很多地方都可建立,只要确定
    再调用QObject::connect()函数前,该信号和槽的对象已经存在。

          (2).多线程间的通信,也可以通过信号和槽来实现。

    4.qt可执行程序在他人电脑上运行显示乱码问题:

      Qt目录plugins下的codecs文件夹下的内容是跟文字显示有关,如果没有这个,可能会出现中文乱码等等一些问题,解决方法如下:

      a. 在主程序main开始处增加以下语句,注意要按顺序书写:

     QApplication::addLibraryPath("./plugins");
     QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB2312"));
     QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
     QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GB2312"));

       b.程序其他地方,包括其他文件、类文件中,直接使用中文,建议还是用tr("中文形式"):

    QString str = tr("我是中文");
    lbl1.setText(str);
    lbl2.setText("你好,中文!");

       c.在部署目录(执行程序放置的目录)中建立子目录 plugins,之后在此目录中建立codecs子目录,将qcncodecs4.dll复制到此子目录中(根据程序需要,有可能是codecs下的其他文件),形成如下目录结构:

    <app-install-dir>pluginscodecs

        d.大功告成!试试你的程序吧,漂亮的中文出现了!

        其实plugins中还可以放置程序中使用的其他插件,如sql和图像处理插件(到qt安装目录下的qtplugins下按目录结构复制你所需要文件的即可)。

    5.qt加载文件,及工程工作目录与可执行文件目录的区别:

           对于较大的程序,程序中可能会调用很多其它工程的dll或者需加载信息,习惯上将可执行程序单独放在一个目录下。

           工作目录:一般情况下是指程序工程目录,而不是可执行程序所在目录(一般在工程目录中的debug目录下)。

           有的时候可执行程序需要脱离工程目录,如将程序放在其它电脑上运行时,以下是将工作目录设置成可执行程序目录的代码:

          (1). qt获得当前可执行程序目录:QDir::currentPath();

          (2).修改工作目录:bool QDir::setCurrent( const QString &path ) [static];

          (3).获得可执行程序所在目录:QString  QCoreApplication::applicationDirPath()  [static];

    [cpp] view plaincopy
     
    1. <span style="font-family:SimSun;font-size:13px;">QString  dir = QApplication::applicationDirPath();  
    2. QDir::setCurrent(dir);</span>  

    6.vs2010无法设置断点问题:The breakpoint will not currently be hit.     

      从菜单栏的 Tools->Options->Debugging->General  
      取消  "Require source to exactly match..." 项的选择。
      还有两个可能是
      1.  打开项目属性,选择调试选项卡,将“启用非托管代码调试”一项钩上。
      2. 由于Terminal Services 这个服务被禁用了,将这个服务设为自动,将这个服务启动。

     以上转自:http://www.cnblogs.com/mapk/archive/2007/08/19/861943.html

    对于单个断点,可以右键—>location—>勾选“allow source code to be defferent”

    7.qt主程序界面退出时,想要使程序退出:

          一般情况下,当程序有多个窗口时,如果没有关闭所有窗口,程序并不会终止,这是因为在窗口被创建时,默认将窗口的属性设置为QWidget::setAttribute( Qt::WA_QuitOnClose,true),即表示程序退出的条件是设置这个属性为true的所有窗口都退出。

         所以如果想要主程序界面退出的时候,程序结束,只要将该窗口上述属性设置为true,其余窗口该属性设置为false,并设置应用程序app如下即可:

         connect( &app,SIGNAL(lastWindowClosed()), &app, SLOT(quit());

    8.qt+vs2010程序在其他为安装vs2010环境的计算机上无法运行解决方案:

            通过depends工具查找程序依赖的dll,正常情况下,对于没有安装vs2010环境的计算机想要运行该程序,需要加载msvcp100.dll、msvcr100.dll、msvcp100d.dll、msvcr100d.dll,这几个dll中100表示2010版。

            

    9.QMainWindow控件中心控件自动添加滚动条,及对窗口标题栏上的最大、最小、关闭按钮的设置:

    [cpp] view plaincopy
     
    1. QTextEdit *edit = new QTextEdit;  
    2. edit->setText(tr("hello world"));  
    3. edit->setGeometry(5,5,1000,800);   
    4. QScrollArea *area = new QScrollArea;  
    5. setCentralWidget(area);  
    6. area->setWidget(edit);//只是中心部分,其余自己自己补充  

    按钮设置:

    setWindowFlags ( Qt::WindowFlags type )
    Qt::FrameWindowHint:没有边框的窗口
    Qt::WindowStaysOnTopHint://总在最上面的窗口
    Qt::CustomizeWindowHint://自定义窗口标题栏,以下标志必须与这个标志一起使用才有效,否则窗口将有默认的标题栏
    Qt::WindowTitleHint:显示窗口标题栏
    Qt::WindowSystemMenuHint://显示系统菜单
    Qt::WindowMinimizeButtonHint://显示最小化按钮
    Qt::WindowMaximizeButtonHint://显示最大化按钮
    Qt::WindowMinMaxButtonsHint://显示最小化按钮和最大化按钮

    Qt::WindowCloseButtonHint://显示关闭按钮

    10.设置窗口为模式对话框或者非模式对话框:

        QWidget :: void setWindowModality ( Qt::WindowModality windowModality )

    11.当用自定义信息参数为自定义结构体时,显示error:

          QObject::connect: Cannot queue arguments of type 'MediaDbAttirbute' (Make sure 'MediaDbAttirbute' is registered using qRegisterMetaType().)

    解决方法:

    qRegisterMetaType<MediaDbAttirbute>("MediaDbAttirbute");

  • 相关阅读:
    element-ui el-tree竖向滚动条和横向滚动条问题
    菜单加滚动条相关样式
    echarts tree 树图总结,点击父节点动态生成子节点,树图数据过多高度自适应,点击子节点跳转页面。
    基于Mininet测量路径的损耗率
    RyuBook1.0案例一:Switching Hub项目源码分析
    深度学习之稠密连接⽹络(DENSENET)
    图形学之图像信号处理
    图形学之卷积滤波器
    图形学之信号处理
    Lecture13_光线追踪1(Whitted-Style Ray Tracing)_GAMES101 课堂笔记
  • 原文地址:https://www.cnblogs.com/yfz0/p/4802942.html
Copyright © 2011-2022 走看看