Qt小技巧总结
刚接触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