《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()));

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值