欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt小技巧总结

程序员文章站 2024-01-04 13:36:58
...

刚接触Qt,还有很多不会的地方,所以把看到感觉有用的小技巧都记下来,说不定以后就用上了。

 

技巧1:Q_UNUSED(name)的用法

用途:Q_UNUSED可以用来忽略编译器警告

举例:int transition::getSTL(int type)

{

        return 123;

}

编译器可能会出现以下警告:

              warning: unused parameter 'type' [-Wunused-parameter]

原因是该参数未使用,这在程序中很正常,所以可以不显示该警告。

解决方法一:在语句“return 123”上一行增加如下代码:

               Q_UNUSED(type);

解决方法二:在pro工程文件最后加入如下代码:

              QMAKE_CXXFLAGS   +=  -Wno-unused-parameter

举例:在绘图中,重绘绘图函数总会出现以下几行代码:

void speedMeter::paintEvent(QPaintEvent *event)
{}

而编译器会显示关于没有使用event的警告

解决方法:增加一行代码:

                Q_UNUSED(event)

来源:https://blog.csdn.net/weixin_39568531/article/details/79174582

 

 

技巧2:如何通过代码方式向widget控件中添加label控件

解决方法1:设定widget的layout(布局方式),然后在layout中添加label控件。

                    this->setLayout(layout);

                    layout->addWidget(label);

解决方法二:直接添加

                   QLabel *label = new QLabel(this);

       或者     QLabel *label = new QLabel(ui->widget);

来源:http://www.makaidong.com/QT开发/415023.shtml

 

 

技巧3:label中图片自适应窗口大小

          QLabel *image1Label = new QLabel();  

          image1Label->setPixmap(QPixmap::fromImage(img1)); 

     使用以上两行代码发现没有效果。原因是当QLabel加载了图片以后,由于图片的大小问题,QLabel会压缩其他控件的位置,使得整个布局都变得凌乱了。

解决方法:部署一个widget控件,在控件中添加label空间,并且不使用任何布局,具体代码如下:

void pixmapLabel::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);  //不再提示 warning 信息
 
    //将图片填充整个label
    pixmap->scaled(label->size(), Qt::KeepAspectRatio);
    label->setPixmap(*pixmap);
    //将label选择合适大小
    int w_w = this->size().width();
    int w_h = this->size().height();
    if(w_w > w_h)
        pixmap_size = w_h;
    else
        pixmap_size = w_w;
    label->resize(pixmap_size,pixmap_size);
    //将label放在widget中间
    int l_w = label->size().width();
    int l_h = label->size().height();
    label->move(QPoint((w_w-l_w)/2,(w_h-l_h)/2-3));

}

     

 

 

技巧4: 双斜杠和三斜杠注释的差别

//是一般注释,而///在编译时会生成类库的相应XML文档,可以在其他文档里查看到XML注释

 

 

技巧5:使用painter在ui子控件中绘图

1.在QT工程中新建一个类PaintLabel,继承自QLabel。

 

#ifndef PAINTLABEL_H

#define PAINTLABEL_H

#include <QLabel>

class PaintLabel:public QLabel

{

    Q_OBJECT

    public:

   explicit PaintLabel(QWidget *parent = 0);

   void paintEvent(QPaintEvent *event);

};

#endif // PAINTLABEL_H

 

#include <QPainter>
#include <QDebug>
#include <extern.h>
#include <QtWidgets/qframe.h>
#include <QWidget>
#include <sys/time.h>
PaintLabel::PaintLabel(QWidget *parent):QLabel(parent)
{}
 
 
void PaintLabel::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    global_var::Cap_Image = global_var::Cap_Image.scaled(this->width(),this->height(),Qt::IgnoreAspectRatio);
    painter.drawImage(QPoint(0,0), global_var::Cap_Image);
 
    QLabel::paintEvent(event);

 

 
 
 
}

 

 

2.在界面设计文件mainwindow.ui中拖入一个QLabel控件,右键->提升为->选择基类QLabel->名称为PaintLabel->输入h文件paintlabel.h->选中->提升。

 

3.原程序中的功能是载入QImage类型的global_var::CapImage图片。读者可以修改代码

 

painter.drawImage(QPoint(0,0), global_var::Cap_Image);

 

将其修改为载入一幅图片进行实验。

来源:https://blog.csdn.net/wlff_csdn/article/details/51437808

 

 

技巧6:quit(),exit(),close()区别

对主程序的退出,可以调用成员函数exit(),同时也可以调用槽quit(),二者此时都能起到关闭应用程序的作用。只是应注意二者调用的方式不同。如下程序示例:

{
QApplication* app;
app->exit(0);
}

或者

{
QApplication* app;
app->exit(0);
}

 此时二者是等价的,即void QApplication::quit ()等价于函数调用 QApplication::exit( 0 )。

另外,quit()作为槽,也可以连接信号和槽的形式,响应某个信号后关闭应用程序。如:

       

QPushButton *quitButton = new QPushButton( "Quit" );
connect( quitButton, SIGNAL(clicked()), qApp, SLOT(quit()) );

如果关闭的不是应用程序,而是关闭窗口等部件的形式,则必须调用close()函数,以关闭部件。如下:

      

  if (!(QMessageBox::information(this,tr("CT Control View"),tr("Do you really want to log out CT Control View?"),tr("Yes"),tr("No"))))
  {
     this->close();
  }

来源:https://www.cnblogs.com/carfield/archive/2011/12/26/2299115.html

 

 

技巧7:string和qstring的相互转换

std::string cstr;

QString qstring;

//从std::string 到QString

qstring = QString(QString::fromLocal8Bit(cstr.c_str()));

//从QString 到 std::string

cstr = string((const char *)qstring.toLocal8Bit());

来源:https://blog.csdn.net/u012348774/article/details/70314716

 

 

 

上一篇:

下一篇: