SiriBlog

siriyang的个人博客


  • 首页

  • 排行榜

  • 标签115

  • 分类37

  • 归档320

  • 关于

  • 搜索

Qt使用中遇到的一些问题

发表于 2020-11-17 更新于 2021-10-29 分类于 计算机 , 技术 , C/C++ 阅读次数: Valine:
本文字数: 8.8k 阅读时长 ≈ 8 分钟

QAction

给QAction设置快捷键

1
ImgRecognizeAct->setShortcut(QKeySequence(tr("Ctrl+Q")));

QCommboBox

在下拉框弹出的时候发送信号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class MyComboBox :public QComboBox
{
Q_OBJECT

signals:
void popupAboutToBeShown();

public:
/*MyComboBox(QWidget* parent = Q_NULLPTR)
{
this->QComboBox::QComboBox(parent);
};*/

// 重写showPopup函数
void showPopup()
{
emit popupAboutToBeShown(); // 发送信号
this->QComboBox::showPopup();// 弹出选项框
};

};

QDateTime

获取当前时间格式化字符串

1
2
QDateTime current_date_time = QDateTime::currentDateTime();
QString current_date = current_date_time.toString("yyyy.MM.dd hh:mm:ss.zzz ddd");

yyyy表示年;MM表示月;dd表示日; hh表示小时;mm表示分;ss表示秒;zzz表示毫秒;ddd表示周几

参考资料

  • Qt 获取当前时间

QFile

文本读写

写入文本文件

1
2
3
4
5
QFile f(path);
f.open(QFile::Append);
QTextStream txtOutput(&f);
txtOutput << "123" << endl;
f.close();

参考资料

  • Qt文本文件的读写操作

快速读取QSS文件

1
2
3
4
5
6
7
8
static QString ReadQSS(QString path) {
QFile f(path);
QString qss("");
f.open(QFile::ReadOnly);
qss = f.readAll();
f.close();
return qss;
}

QImage

QImage图像放缩

1
*qimg=qimg->scaled(200, 200, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);

  第一、二参数代表缩放后的尺寸,第三个参数代表忽略比例,也可调用IgnoreAspectRatio保持长宽比例,第四个参数代表平滑处理,使图片缩小时不失真。

参考资料

  • QT:利用QImage实现图片不失真缩放,并在屏幕中心缩放

cv::Mat与QImage之间的转换

QImage转cvMat

有些情况下该版本会有点问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cv::Mat QImage2cvMat(QImage image)
{
cv::Mat mat;
switch (image.format())
{
case QImage::Format_ARGB32:
case QImage::Format_RGB32:
case QImage::Format_ARGB32_Premultiplied:
mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.bits(), image.bytesPerLine());
break;
case QImage::Format_RGB888:
mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.bits(), image.bytesPerLine());
cv::cvtColor(mat, mat, CV_BGR2RGB);
break;
case QImage::Format_Indexed8:
mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.bits(), image.bytesPerLine());
break;
}
return mat;
}
更为优化的版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
cv::Mat QImage2cvMat(const QImage& image)
{
switch(image.format())
{
// 8-bit, 4 channel
case QImage::Format_ARGB32:
break;
case QImage::Format_ARGB32_Premultiplied:
{
cv::Mat mat(image.height(), image.width(),
CV_8UC4,
(void*)image.constBits(),
image.bytesPerLine());
return mat.clone();
}

// 8-bit, 3 channel
case QImage::Format_RGB32:
{
cv::Mat mat(image.height(),image.width(),
CV_8UC4,
(void*)image.constBits(),
image.bytesPerLine());

// drop the all-white alpha channel
cv::cvtColor(mat, mat, cv::COLOR_BGRA2BGR);
return mat.clone();
}
case QImage::Format_RGB888:
{
QImage swapped = inImage.rgbSwapped();
cv::Mat mat(swapped.height(), swapped.width(),
CV_8UC3,
(void*)image.constBits(),
image.bytesPerLine());
return mat.clone();
}

// 8-bit, 1 channel
case QImage::Format_Indexed8:
{
cv::Mat mat(image.height(),image.width(),
CV_8UC1,
(void*)image.constBits(),
image.bytesPerLine());
return mat.clone();
}

// wrong
default:
qDebug() << "ERROR: QImage could not be converted to Mat.";
break;
}
return cv::Mat();
}

cvMat转QImage

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
QImage cvMat2QImage(const cv::Mat& mat)
{
// 8-bits unsigned, NO. OF CHANNELS = 1
if (mat.type() == CV_8UC1)
{
QImage image(mat.cols, mat.rows, QImage::Format_Indexed8);
// Set the color table (used to translate colour indexes to qRgb values)
image.setColorCount(256);
for (int i = 0; i < 256; i++)
{
image.setColor(i, qRgb(i, i, i));
}
// Copy input Mat
uchar *pSrc = mat.data;
for (int row = 0; row < mat.rows; row++)
{
uchar *pDest = image.scanLine(row);
memcpy(pDest, pSrc, mat.cols);
pSrc += mat.step;
}
return image;
}
// 8-bits unsigned, NO. OF CHANNELS = 3
else if (mat.type() == CV_8UC3)
{
// Copy input Mat
const uchar *pSrc = (const uchar*)mat.data;
// Create QImage with same dimensions as input Mat
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888);
return image.rgbSwapped();
}
else if (mat.type() == CV_8UC4)
{
// Copy input Mat
const uchar *pSrc = (const uchar*)mat.data;
// Create QImage with same dimensions as input Mat
QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32);
return image.copy();
}
else
{
return QImage();
}
}

QImage保存

1
qimg.save(path + "/" + pureFileName + ".jpg", "JPG",100);
  1. pictrureName为图片文件的路径,比如:”/home/feng/IMG_0.jpg”,需要注意的是路径必须要有权限读写;
  2. “JPG”为图片的格式,注意不需要带”.”;
  3. 100指的是图片的质量因数,范围必须在0到100之内或-1,指定0以获取小型压缩文件,指定100表示大型未压缩文件,使用-1(默认值)使用默认设置。

参考资料

  • Qt5.7.1中使用QImage保存成JPG图像到本地

QInputDialog

整型输入对话框:

1
2
3
4
5
bool ok;
int i = QInputDialog::getInt(this, tr("QInputDialog::getInteger()"),
tr("Percentage:"), 25, 0, 100, 1, &ok);
if (ok)
integerLabel->setText(tr("%1%").arg(i));

文本输入对话框:

1
2
3
4
5
6
bool ok;
QString text = QInputDialog::getText(this, tr("QInputDialog::getText()"),
tr("User name:"), QLineEdit::Normal,
QDir::home().dirName(), &ok);
if (ok && !text.isEmpty())
textLabel->setText(text);

参考资料

  • QInputDialog 使用方法

QLabel

在QLabel中显示图片

1
2
3
4
QImage *qimg = new QImage("./img/icon/siripr_icon_1000_1000.png");
qimg->scaled(200, 200);
QLabel* imgLabel = new QLabel();
imgLabel->setPixmap(QPixmap::fromImage(*qimg));

QPushButton

PushButton绑定事件

  在绑定槽函数的时候第一种写法语法上不会报错,但是实际上绑定失败。应该改为第二中写法,被绑定的函数不能具体到某一个对象,而是类的一个成员函数。

1
2
-connect(this->m_imgPRBtn, SIGNAL(clicked()), this, SLOT(this->On_ImgRecognizeAct_clicked()));
+connect(this->m_imgPRBtn, SIGNAL(clicked()), this, SLOT(On_ImgRecognizeAct_clicked()));

或者使用另一种写法:

1
connect(this->m_imgPRBtn, &QPushButton::clicked, this, &MainWindow::On_ImgRecognizeAct_clicked);

QPainter

在QPixmap上进行绘画

1
QPainter painter(&pixmap);

设置画笔属性

1
painter.setPen(QPen(QColor("#000"), 3));

状态保存与恢复

1
2
3
4
5
painter.save();

...//各种绘制操作

painter.restore();

绘制矩形

矩形框

1
painter.drawRect(rect.x, rect.y, rect.width, rect.height);

填充矩形

绘制文本

1
2
3
4
5
QFont font;
font.setPixelSize(16);
painter.setFont(font);
painter.setPen(QPen(QColor("#000"), 3));
painter.drawText(rect.x, rect.y, text);

测量文本尺寸

1
2
3
QFontMetrics metrics(font);
int w = metrics.width(text); //获取显示文本的宽度
int h = metrics.height(); //获取显示文本的高度

参考资料

  • 28.QT-QPainter介绍

QSetting

使用QSetting读写ini文件

打开ini文件

1
2
// 根据ini文件路径新建QSettings类
QSettings* m_IniFile = new QSettings("ini文件的路径", QSettings::IniFormat);

读取数据

1
m_IniFile->value( "节名" + "/" + "键名").toString();

写入数据

1
m_IniFile->setValue( "节名" + "/" + "键名",  "键对应的值");

参考资料

  • Qt如何用QSettings读写ini配置文件
  • QSettings读写注冊表、配置文件

QSpinBox

绑定事件

1
connect(this->m_spinbox_MaxPlates, QOverload<int>::of(&QSpinBox::valueChanged), this, &ImgPRWidget::on_spinbox_MaxPlates_valueChanged);

QString

QString与std::string相互转换

将QString转换为std::string

1
2
3
4
5
std::string QStringToStdString(QString str) {
QTextCodec *code = QTextCodec::codecForName("gb18030");
std::string stdstr = code->fromUnicode(str).data();
return stdstr;
}

将std::string转换为QString

1
2
3
4
5
//将std::string转换为QString
QString StdStringToQString(std::string str) {
QString qstr = QTextCodec::codecForLocale()->toUnicode((str).c_str());
return qstr;
}

虽然Qt有内置的转换函数,但是有可能会打乱中文编码

Qt内置函数

1、多字节编码转QString

  • 多字节转QString:QString::fromStdString
  • QString转多字节:QString::toStdString()

2、unicode编码转QString

  • unicode转Qstring:QString::fromStdWString
  • Qstring转unicode:QString::toStdWString()

3、utf8编码转QString

  • utf8转QString:QString::fromUtf8
  • QString转utf8:QString::toUtf8

参考资料

  • QT中常用QString字符串编码格式转换函数

格式化参数

1
2
3
4
5
6
QString i;           // current file's number
QString total; // number of files to process
QString fileName; // current file's name

QString status = QString("Processing file %1 of %2: %3")
.arg(i).arg(total).arg(fileName);

参考资料

  • 【Qt】QString 格式化参数

QWedget

将主窗口居中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "mainwindow.h"
#include <QApplication>
#include <qdesktopwidget.h>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;

QDesktopWidget *desktop = QApplication::desktop();
w.move((desktop->width() - w.width())/ 2, (desktop->height() - w.height()) /2);
w.show();

return a.exec();
}
-------- 本文结束 感谢阅读 --------
相关文章
  • 基于Qt的工业名牌识别系统遇到的问题
  • OpenCV3使用中遇到的一些问题
  • C++编程遇到的问题
  • VisualStudio一个解决方案中创建多个项目
  • C/C++数据输入练习
觉得文章写的不错的话,请我喝瓶怡宝吧!😀
SiriYang 微信支付

微信支付

SiriYang 支付宝

支付宝

  • 本文标题: Qt使用中遇到的一些问题
  • 本文作者: SiriYang
  • 创建时间: 2020年11月17日 - 20时11分
  • 修改时间: 2021年10月29日 - 18时10分
  • 本文链接: https://blog.siriyang.cn/posts/20201117201620id.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
学习笔记 C/C++ Qt
OpenCV3使用中遇到的一些问题
讲座笔记:k-sums聚类:一种可替代k-means的高效聚类算法
  • 文章目录
  • 站点概览
SiriYang

SiriYang

努力搬砖攒钱买镜头的摄影迷
320 日志
33 分类
88 标签
RSS
GitHub E-Mail
Creative Commons
Links
  • 友情链接
  • 作品商铺

  1. QAction
    1. 给QAction设置快捷键
  2. QCommboBox
    1. 在下拉框弹出的时候发送信号
  3. QDateTime
    1. 获取当前时间格式化字符串
  4. QFile
    1. 文本读写
    2. 快速读取QSS文件
  5. QImage
    1. QImage图像放缩
    2. cv::Mat与QImage之间的转换
    3. QImage保存
  6. QInputDialog
  7. QLabel
    1. 在QLabel中显示图片
  8. QPushButton
    1. PushButton绑定事件
  9. QPainter
  10. 在QPixmap上进行绘画
  11. 设置画笔属性
  12. 状态保存与恢复
  13. 绘制矩形
  14. 绘制文本
  15. 测量文本尺寸
  16. QSetting
    1. 使用QSetting读写ini文件
  17. QSpinBox
    1. 绑定事件
  18. QString
    1. QString与std::string相互转换
    2. 格式化参数
  19. QWedget
    1. 将主窗口居中
蜀ICP备19008337号 © 2019 – 2025 SiriYang | 1.7m | 25:41
0%