《15寸移动式心电监测仪》制作纪实 : Qt 总结帖一
写在前面
本篇为最近制作《15寸移动式心电监测仪》所使用Qt的记录贴,将来会加以整理分成单独的篇章。
Qtimer
头文件(*.h)声明:
private:
QTimer *m_timer;
void InitTimer();
private slots:
void TimerTimeOut();
头文件(*.cpp)实现:
void MainWindowDlg::InitTimer()
{
if(NULL == m_timer)
m_timer = new QTimer;
//设置定时器是否为单次触发。默认为 false 多次触发
m_timer->setSingleShot(false);
//启动或重启定时器, 并设置定时器时间:毫秒
m_timer->start(2000);
//定时器触发信号槽
connect(m_timer, SIGNAL(timeout()), this, SLOT(ImageTimerTimeout()));
}
void MainWindowDlg::TimerTimeOut()
{
//判断定时器是否运行
if(m_timer->isActive())
m_timer->stop(); //停止定时器
//执行定时器触发时需要处理的业务
}
我目前使用的两个QTimer:
Qdialog
界面选dialog的几个都行。
头文件(*.h)声明:
private:
Dialog_init *dialog;
signals:
void welcomesig(QString);
头文件(*.cpp)实现:
//如果让其持续显示,必须使用静态变量的形式来创建,如果使用临时变量创建,则会随函数执行完毕而销毁
dialog = new Dialog_init();
//setModal(true)为模态对话框,不可以操作其它UI,false(默认)为非模态对话框,可以操作其它UI
dialog->setModal(false);
//这里的slot函数在dialog类里面定义,定义成public slots,注意不要写Dialog_init::change_label,尽管不报错迪但调用失败,就按我这样写
connect(this, SIGNAL(welcomesig(QString)), dialog, SLOT(change_label(QString)));
//显示dialog show为不阻塞代码,exec阻塞等待对话框返回。
dialog->show();
//dialog->exec();
//关闭dialog
dialog->close();
//发射信号(实现效果为更改dialog的label文本)
emit welcomesig("yes!!");
dialog的头文件(*.h)声明:
dialog的cpp实现:
project截图:
窗口边框与按钮
WindowType_Mask = 0x000000ff,
MSWindowsFixedSizeDialogHint = 0x00000100,
MSWindowsOwnDC = 0x00000200,
BypassWindowManagerHint = 0x00000400,
X11BypassWindowManagerHint = BypassWindowManagerHint,
//无边框窗口
FramelessWindowHint = 0x00000800,
WindowTitleHint = 0x00001000,
WindowSystemMenuHint = 0x00002000,
WindowMinimizeButtonHint = 0x00004000,
WindowMaximizeButtonHint = 0x00008000,
WindowMinMaxButtonsHint = WindowMinimizeButtonHint | WindowMaximizeButtonHint,
WindowContextHelpButtonHint = 0x00010000,
WindowShadeButtonHint = 0x00020000,
//保持在最前面
WindowStaysOnTopHint = 0x00040000,
WindowTransparentForInput = 0x00080000,
WindowOverridesSystemGestures = 0x00100000,
WindowDoesNotAcceptFocus = 0x00200000,
MaximizeUsingFullscreenGeometryHint = 0x00400000,
//无边框窗口,但可以缩放
CustomizeWindowHint = 0x02000000,
//保持在最后面
WindowStaysOnBottomHint = 0x04000000,
WindowCloseButtonHint = 0x08000000,
MacWindowToolBarButtonHint = 0x10000000,
BypassGraphicsProxyWidget = 0x20000000,
NoDropShadowWindowHint = 0x40000000,
WindowFullscreenButtonHint = 0x80000000
如何设置:
setWindowFlags (Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
如果没有效果,这样:
hide();
setWindowFlags (Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);
show();
Qt文件路径
下面讲几个Qt常用的获取路径的函数
//1 .获取应用程序可执行文件所在的目录: QCoreApplication::applicationDirPath();
QString applicationDirPath;
applicationDirPath = QCoreApplication::applicationDirPath();
qDebug()<<"applicationDirPath"<<applicationDirPath;
//2.获取应用程序可执行文件的文件路径: QCoreApplication::applicationFilePath();
QString applicationFilePath;
applicationFilePath = QCoreApplication::applicationFilePath();
qDebug()<<"applicationFilePath"<<applicationFilePath;
//3.获取应用程序当前工作目录的绝对路径:QString QDir::currentPath() (这个类似于“./”操作)
QString currentPath;
QDir dir;
currentPath=dir.currentPath();
qDebug()<<"path"<<currentPath;
我们来解释下QFile file(“text.txt”)加载不成功 ,如果text.txt是在可执行文件同级目录下,是可以打开的,否则则打不开
全屏显示
showFullScreen();
设置窗口背景颜色以及图片
//设置背景图片 path:图片路径
void MainWindow ::setBackgroundImage(QString path)
{
QPixmap pixmap = QPixmap(path).scaled(this->size());
QPalette palette(this->palette());
palette.setBrush(QPalette::Background, QBrush(pixmap));
this->setPalette(palette);
}
//设置纯色背景
void MainWindow ::setBackgroundColor()
{
QPalette palette(this->palette());
palette.setColor(QPalette::Background, QColor(111,111,111));
this->setPalette(palette);
}
设置按钮三态切图
获得并显示日期时间
.h文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QTimer>
#include <QDateTime>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
public slots:
void timerUpdate(void);
};
.cpp文件
#endif // MAINWINDOW_H
实现函数:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QTimer *timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(timerUpdate()));
timer->start(1000);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::timerUpdate(void)
{
QDateTime time = QDateTime::currentDateTime();
QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd");
ui->label->setText(str);
}
运行效果如下:
原文:https://blog.csdn.net/qq_40388909/article/details/79238265
Qt 数据与QString互转
QString转其它:toXXX()
QString data;
float num = data.toFloat();
QString转const char
QString str = "this is a QString to const char test!";
const char aa[]=str.toLatin1().data();
其它转QString:QString::number
QString::number是将数数字(整数、浮点数、有符号、无符号等)转换为QString类型,常用于UI数据显示。查看API接口,number提供如下几种类型的转换,适合各种场合调用。
static QString number(int, int base=10);
static QString number(uint, int base=10);
static QString number(long, int base=10);
static QString number(ulong, int base=10);
static QString number(qlonglong, int base=10);
static QString number(qulonglong, int base=10);
static QString number(double, char f='g', int prec=6);
第一个参数:待转换数字
第二个参数(整型):转换进制
第二个参数(浮点数):浮点数格式
第三个参数(浮点数):保留小数位数
默认情况下是十进制显示方式转换,也可以使用八进制、十六进制显示方式调用。
int a = 20;
uint b =255;
QString::number(a);
QString::number(a,10);
QString::number(b);
QString::number(b,16);
//结果:“20”,“20”,“255”,“ff”。
float a=1.234;
QString::number(a,‘f’, 2);
//结果:1.23
//保留2位有效数字,以简单方式表示,或者科学计数法表示
float a;
QString::number(a, ‘g’, 2);
例如:
0.00001,结果:1e-5
0.00012,结果:1.2e-4
1.23,结果:1.2
//保留指定位数(如001)
整数转换为字符串,并保留3位,不足在前面补0,这一块属于“sprintf”范畴:
int a=1;
QString str=QString::number(a).sprintf("%03d",a);
//或
QString str=QString("%1").arg(a, 3, 10, QChar('0'));
Qt 报SIGILL/SIGSEGV等信号解决
可能是Qt自己的bug。
QT界面上的“构建”==》“清理所有项目”,然后重新RUN。
Qt报auto does not name a type解决(开启C++ 11方法)
有以下解决方法:
1.Qt 5.x的版本,在 .pro文件里加:
CONFIG += C++11
2.对于 Qt 5.x之前的版本,在 .pro文件里使用这句话 :
QMAKE_CXXFLAGS += -std=c++0x
qt中获取容器QVector中的最大值和最小值
获取qt容器中的最大值和最小值的做法:
一、加上头文件
#include <QVector>
二、如下代码:
QVector <double> data {11.0, 44.0, 22.0, 33.0, 10.0,65.0};
//第一种表示最大值:
// QVector<double>::iterator max = std::max_element(std::begin(data), std::end(data));
//第二种表示最大值:
auto max = std::max_element(std::begin(data), std::end(data));
//最小值表示:
auto min = std::min_element(std::begin(data), std::end(data));
//直接赋值表示
double biggest = *max;
double smallest = *min;
//最大值和最小值的位置的表示方式:
auto positionmax = std::distance(std::begin(data),max);
auto positionmin = std::distance(std::begin(data),min);
int posmax = positionmax;
int posmin = positionmin;
qDebug()<<"biggest = "<<biggest;
qDebug()<<"smallest = "<<smallest;
qDebug()<<"pos ="<<posmax;
qDebug()<<"posmin = "<<posmin;
使用第二种方式找到最大值:
for(auto y2:data)
{
if(qAbs(y2)>ymax)
{
ymax = qAbs(y2);
}
}
原文:https://blog.csdn.net/littlehero_121/article/details/100565527
Qt在linux系统中执行shell命令
在linux系统下,Qt执行shell命令的方式有3种:
#include <QProcess>//方法1,3加入这个头文件
(1)QProcess:execute(“ls”);
(2)system(“ls”);
(3)QProcess *process = new QProcess(); process->start(“ls”);
注1:以上3中方法都可以,但是前两种会阻塞进程,直到ls结束,而第三种不会阻塞进程,可以多任务运行。
注2:当命令中存在管道(|)和重定向(>)时,只能使用第二种,第一种和第三种属于Qt自身的,不能识别这两种符号。
QThread的用法
介绍两篇文章:
https://www.cnblogs.com/xia-weiwen/p/10306089.html
https://www.baidu.com/link?url=CaYcB0Y-ezfFL86xM25-MgYQQrAhi4A3rgFWfAsXBv0ceiW0ZOt4CnjRvtRQ2QWXJG7m0OmWIuMFfYD_L8eEQ7hxEkRpILx_Ux1-T8nOic7&wd=&eqid=e9132352001d8c23000000035fe5a123
这两篇文章一定都要看,而且要看完
第二篇上来就Worker Controller有点吓人,但是坚持一下,你会发现它的思路挺清晰,讲的挺好。
Object::connect: Parentheses expected
Object::connect: Parentheses expected, signal QAction::activated
Object::connect: (receiver name: ‘MainWindow’)
这是提示你,语句中少了括号啊!
像这样:
connect(print,SIGNAL(activated),this,SLOT(print()));
其实应该被写成:
connect(print,SIGNAL(activated()),this,SLOT(print()));