QT如何设置模态窗口、qss中的image丢失、进程自杀、任务日志、命令行中文乱码
1.设置模态窗口
对窗口设定属性如下:
this->setWindowModality(Qt::WindowModal);
注意模态窗口只对父窗口生效,在建立窗口的时候要注意,如果不是指针也可以用setParent方法进行
2.qss中的image丢失
不知道为什么,在qss中进行image设置的时候,莫名其妙的图标就会丢失,我看了一下午没感觉到有什么原理上的问题,戴工说的是就是有些设备对小图标的支持有问题?我觉得不是这么回事,具体什么原因我也没找到,不过据说就是QSS界面就是单纯的玄学罢了。
怎么解决的呢?就是不用pushbutton了,改用widget,然后给widget添加上一个eventfilter事件,单独设置一下,反正点击事件的槽函数也是我自己重写的,所以是不是按钮也没有关系,只用稍微转发一下事件就好了。
3.进程自杀:
这个是戴工给我的代码。可以更好的结束进程,注销掉所有的资源,避免QApplication::exit()的时候会出一些莫名其妙的超栈bug,这样就需要用一个更好的代码来注销所有的资源。
以下是代码,之后会画个事件单独整理一下所有可重用资源:
void tApp::KillMySelf()
{
QString qsAppName = QString("%1.exe").arg(QCoreApplication::applicationName());
KillProcessByName(qsAppName);
}
void tApp::KillProcessByID(int nID)
{
QProcess p;
QString cmd = QString("taskkill /F /PID %1 /T").arg(QString::number(nID));
p.execute(cmd);
p.close();
}
void tApp::KillProcessByName(const QString &qsName)
{
QString qsConvertName = qsName;
qsConvertName.replace('/', '\\');
qsConvertName = qsConvertName.mid(qsConvertName.lastIndexOf('\\') + 1);
QProcess p;
QString cmd = QString("taskkill /F /IM %1 /T").arg(qsName);
p.execute(cmd);
p.close();
}
4.任务日志:
任务日志也是一个可重用的代码,可以直接在main函数处就直接调用,如果是release模式下就没有输出的debug消息,只会输出消息到txt文件中
需要在main.cpp中声明
#define QT_MESSAGELOGCONTEXT
main函数中调用如下:
QT_LOG::logInit("errorlog.txt",0);
QLog.h的内容:
#ifndef LOG_H
#define LOG_H
#include <QFile>
#include <QTextStream>
#include <QDateTime>
#include <QMutex>
//选择屏幕打印还是输出到文件可以根据这个宏控制或者控制函数调用位置都可以
//#define _DEBUG
//默认调试级别为warning,即小于warning级别的都不会写入日志文件
//只有release版本的时候,才会输出到日志,debug版本正常输出到终端。
namespace QT_LOG
{
//默认文件名为当前时间命名的log文件
static int m_LogLevel = 1;
static QString m_LogFile = QString("%1.log").arg(QDateTime::currentDateTime().toString("yyyyMMddhhmmss"));
QMutex m_LogMutex;
void customMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
//设置输出日志级别,小于该级别,将不会写入日志文件,默认是warning级别,即debug信息不会写入日志文件
if (type < m_LogLevel)
{
return;
}
QString log_info;
switch (type)
{
case QtDebugMsg:
log_info = QString("%1[Debug]:").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
break;
case QtWarningMsg:
log_info = QString("%1[Warning]:").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
break;
case QtCriticalMsg:
log_info = QString("%1[Critical]:").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
break;
case QtFatalMsg:
log_info = QString("%1[Fatal]:").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
abort();
case QtInfoMsg:
log_info = QString("%1[Info]:").arg(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
break;
}
log_info += QString(context.file) + QString(context.line) + QString("%1").arg(msg);
//为了线程安全
m_LogMutex.lock();
QFile outFile(m_LogFile);
outFile.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text);
QTextStream ts(&outFile);
ts << log_info << endl;
outFile.close();
m_LogMutex.unlock();
}
//默认调试级别为warning及以上才会写入日志文件,默认log文件名为程序启动时间命名的log文件
void logInit(QString logFile = "", int logLevel = 1)
{
#ifndef _DEBUG //实现debug版本的时候,输出到终端;release版本的时候输出到日志文件
if ((logLevel < 0) || (logLevel > 3))
{
m_LogLevel = 1;
}
else
{
m_LogLevel = logLevel;
}
if (!logFile.isEmpty())
{
m_LogFile = logFile;
}
qInstallMessageHandler(customMessageHandler);
#endif
}
}
#endif // LOG_H
5.命令行中文乱码
不知道我的电脑的默认编码格式是出了什么问题,总之就是Qt默认是不可以输出中文的,但是莫名其妙的就是可以,本来命令行传中文是没事的,但是莫名其妙的我的代码传中文就是乱码,可能这边项目做完了周末找个时间来重装以下系统吧,具体原因我也不清楚。
解决方法:加入QString::fromLocal8Bit();
QT如何设置模态窗口、qss中的image丢失、进程自杀、任务日志、命令行中文乱码的更多相关文章
- 3dsmax不同版本 pyside qt UI 设置max窗口为父窗口的方法
3dsmax不同版本 pyside qt widget 设置 max 窗口为父窗口的方法 前言: 3dsmax 在 2014 extension 之后开始集成 Python 和 PySide,但是在版 ...
- Qt疑难问题-模态窗口父类被析构
最近遇到一个朋友,问了我一个刁钻的问题,当你模态弹出一个窗体时,后台把这个窗体的父类给析构了,这个时候会出现什么样的情况? 听到问题后我真是一脸懵逼呀!从来没有这么写过代码. 随后写了一个简单的测试d ...
- 设置C#启动进程但不显示命令行窗口
设置一下Process类型相关的配置属性即可,直接上代码. //记得引入命名空间 //using System.Diagnostics; //获得当前环境的基路径 string basePath = ...
- 正确设置越狱版ios的终端编码--命令行中文的处理
本文是针对越狱版iPhone手机的,手机没有越狱就别看了,看了也没办法用. 越狱版的iPhone当然是为了跟电脑一样做各种有趣的事情的. 但通常越狱的iPhone在命令行都无法处理中文,比如你的播放器 ...
- 在 Perl 中使用 Getopt::Long 模块来接收用户命令行参数
我们在linux常常用到一个程序需要加入参数,现在了解一下 perl 中的有关控制参数的模块 Getopt::Long ,比直接使用 @ARGV 的数组强大多了.我想大家知道在 Linux 中有的参数 ...
- 在Perl中使用Getopt::Long模块来接收用户命令行参数
我们在linux常常用到一个程序需要加入参数,现在了解一下perl中的有关控制参数的函数.getopt.在linux有的参数有二种形式.一种是–help,另一种是-h.也就是-和–的分别.–表示完整参 ...
- 在linux中导入sql文件的方法分享(使用命令行转移mysql数据库)
因导出sql文件 在你原来的网站服务商处利用phpmyadmin导出数据库为sql文件,这个步骤大家都会,不赘述. 上传sql文件 前面说过了,我们没有在云主机上安装ftp,怎么上传呢? 打开ftp客 ...
- qt designer设置界面是label中文字与文本框对齐设置
往往在使用 qt designer布置界面时,添加的label和文本框中是直接从工具箱中拖进去的,由于每个控件尺寸大小不一,就会造成label中的文字相对于文本框比较较偏上,看下面未经调整的直接效果 ...
- git工作中最常用的用法教程,不走命令行
·1.1 git的概述 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Lin ...
- LR中Vugen的多进程与多线程(脚本命令行)
Controller使用驱动程序(如mdrv.exe或r3vuser.exe)来运行Vuser.用户可以在Controller的run-time setting中选择Vuser的运行方式:多进程/多线 ...
随机推荐
- 基于MySQL的-u选项实现如何最大程度防止人为误操作MySQL数据库
在mysql命令加上选项-U后,当发出没有WHERE或LIMIT关键字的UPDATE或DELETE时,MySQL程序就会拒绝执行.那么,我们基于MySQL提供的这项设置,就可以轻松实现如何最大程度防止 ...
- 【Linux】指令学习
Linux学习记录 生命不息,写作不止 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 1.虚拟机网卡配置 服务器重启完成之后,我们可以通过linux的指令 ip addr ...
- 「国产系统」Tubian 0.1,兼容Windows和Android的GNU/Linux系统!
Tubian 0.42已发布:https://www.cnblogs.com/tubentubentu/p/16745926.html Tubian是我的自用系统整理而成的Linux发行版,基于Deb ...
- 测试Thread中的常用方法:
测试Thread中的常用方法:start():启动当前线程:调用当前线程的run()run(): 通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中currentThread ...
- uoj316【NOI2017】泳池
题目链接 \(S=k\)可以拆成\(S\le k\)减去\(S\le k-1\).用\((i,j)\)表示第i行第j列. 设\(g(i,j)\)表示前i行前j列都安全其他未知满足条件的概率,\(h(i ...
- 消除两个inline-block元素之间的间隔
发现问题 两个inline-block元素之间的间隔.如下图 期望 消除两个inline-block元素之间的间隔. 解决方法 1.父元素字体大小设置为0 间隔的形成是非元素标签形成的 /** 方案1 ...
- echarts在Vue项目中的实际运用效果图
文章目录 1.在后台系统首页中.可以根据需求制作相应的图表 2.在Vue中使用echarts的详细过程参照这个链接 1.在后台系统首页中.可以根据需求制作相应的图表 2.在Vue中使用echarts的 ...
- Tesla-E380,4K eDP一键点屏神器问世
eDP屏快速点亮,EDID回读, eDP屏调试 是否为点屏的准备工作感到烦躁: 1)查找LCD模组的数据手册(常常还未必能找着) 2)在上位机软件或者单片机程序里设置一大堆的LCD屏参,这个频率,那个 ...
- 2022,一个Java程序猿的外设配置
工欲善其事,必先利其器. 是的没错,我就是个器材党,哈哈.正赶上搬家布置了新桌面,经过我的精心挑选和安装,也是凑齐了我新一套的桌面外设.写下来记录一下. 键盘 套件:腹灵MK870 轴体:佳达隆G白P ...
- 机器学习中in-domine, out-domine的区别
in-domine 为域内数据,即为训练模型时使用的数据: out-domine 为域外数据,即为检验模型时使用的数据.