当前位置:   article > 正文

Qt零碎记录_qt隐藏窗口任务栏图标

qt隐藏窗口任务栏图标

一、隐藏任务栏窗口图标

QT里的parent参数:我们在写界面的时候,几乎每个构造函数里都会有一个parent参数。这个参数通常是QObject* 或者是QWidget* 类型,初始值0;

我们基本上也没理会,但是你有没有想过,这个parent有什么作用呢?

“对话框”,对话框一般是不作为顶层容器出现的,因此在任务栏上是没有对话框的位置的,指定对话框的parent属性,任务栏就不会出现图标。如果你不指定,这个对话框就成为顶层容器了,任务栏会出现图标。利用这个特性,就可以实现我们的窗体是否需要在任务栏上出现。

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QApplication::setQuitOnLastWindowClosed(false);

    QWidget* parent = new QWidget;
    MainWindow* w = new MainWindow(parent);
    w->show();
    w->activateWindow();
    int ret = a.exec();
    delete parent;
    return ret;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

运行软件后,任务栏一般都会有一个软件的图标,使用此行代码可以将任务栏窗口图标隐藏起来


二、Qt关闭电脑

#include <Windows.h>

system("shutdown -s -t 00");	//关机
system("shutdown -r -t 00");	//重启
system("shutdown -l -t 00");	//注销

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

-t: 指令执行延时时间,例如system("shutdown -s -t 00");就是马上关机。


三、Qt常用路径

应用程序可执行文件所在目录

QString applicationDirPath = QCoreApplication::applicationDirPath();
  • 1

应用程序可执行文件的文件路径

QString applicationFilePath = QCoreApplication::applicationFilePath();
  • 1

四、Qt读写文件

QFile::open()函数打开文件是需要传递QIODevice::OpenModeFlag枚举类型的参数,决定以什么方式打开

QIODevice::OpenModeFlag枚举类型说明
QIODevice::ReadOnly以只读方式打开文件,用于载入文件
QIODevice::WriteOnly以只写方式打开文件,用于保存文件
QIODevice::ReadWrite以读写方式打开
QIODevice::Append以添加模式打开,新写入文件的数据添加到文件尾部
QIODevice::Truncate以截取方式打开文件,文件原有的内容全部被删除
QIODevice::Text读取时“\n”被自动翻译为换行符,写入时字符串结束符会自动翻译为系统平台的编码,如 Windows 平台下是“\r\n”

用QFile类的IODevice读写功能进行读写

	QString filePath = "xxx";
	QFile file(filePath);
	if(!file.exists()) {
		return;
	}
	if(!file.open(QIODevice::ReadOnly |QIODevice::Text)) {
		return;
	}
	while(!file.atEnd()) {
		QString lineStr = file.readLine();
	}
	
	file.close();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

用QFile和QTextStream结合起来,用流(Stream)的方法进行文件读写

	QString filePath = "xxx";
	QFile file(filePath);
	if(!file.exists()) {
		return;
	}
	if(!file.open(QIODevice::WriteOnly |QIODevice::Text)) {
		return
	}
	QTextStream Stream(&file);	//用文本流读取文件
	Stream << "内容1";
	Stream << "内容2";
	Stream << "内容3";

	file.close();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

五、QByteArray和QString互转

QByteArray转QString

QByteArray bytes("hello world");
QString data = bytes;   // QByteArray转QString方法1
  • 1
  • 2

QString转QByteArray

QString data("yudabo");  
QByteArray bytes = data.toUtf8();    // QString转QByteArray方法1 
 
QString data("yudabo");  
QByteArray bytes = data.toLatin1();  // QString转QByteArray方法2
  • 1
  • 2
  • 3
  • 4
  • 5

六、connect各式写法

//Qt4
connect(sender,SIGNAL(sig_xxx(para1,para2)),receiver,SLOT(slot_xxx(para1,para2)));
//示例
connect(ui->btn,SIGNAL(sig_btn()),this,SLOT(slot_btn()));

//Qt5不带参数
connect(sender,&className::sig_xxx,receiver,&className::slot_xxx);
//示例
connect(ui->btn,&QPushButton::sig_btn),this,&QMainWindow::slot_btn));

//Qt5带参数
connect(sender,QOverload<para_type>::of(&className::sig_xxx),receiver,QOverload<para_type>::of(&className::slot_xxx));
//示例
connect(ui->btn,QOverload<bool>::of(&QPushButton::sig_btn)),this,QOverload<bool>::of(&QMainWindow::slot_btn)));

lamda表达式
connect(sender,&className::sig_xxx,[=]{
	...
});
//示例
connect(ui->btn,&QPushButton::sig_btn,[=]{
	qDebug()<<"按钮按下!";
});
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

七、获取字符串的像素宽高

//设置字体
QFont font;
font.setFamily("Microsoft YaHei");
font.setPointSize(8);
QFontMetrics fm(font);
QRect rec = fm.boundingRect("这是要获取宽度和高度的字符串");
//字符串所占的像素宽度,高度
int textWidth = rec.width();
int textHeight = rec.height();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

八、非阻塞延时

void sleep(int sectime)
{
    QTime dieTime = QTime::currentTime().addMSecs(sectime);
 
    while (QTime::currentTime() < dieTime) {
        QCoreApplication::processEvents(QEventLoop::AllEvents, maxtime);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

九、获取本机IP

QString Widget::getIP() //获取ip地址
{
    QString ip_address;
    QList<QHostAddress> ipAddressesList = QNetworkInterface::allAddresses();
    for (int i = 0; i < ipAddressesList.size(); ++i)
    {
        if (ipAddressesList.at(i) != QHostAddress::LocalHost &&  ipAddressesList.at(i).toIPv4Address())
        {
            ip_address = ipAddressesList.at(i).toString();
        }
    }
    if (ip_address.isEmpty())
        ip_address = QHostAddress(QHostAddress::LocalHost).toString();
    return ip_address;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

十、QTextBrowser文字

ui->msgBrowser->setTextColor(Qt::blue);	//整体设置颜色
ui->msgBrowser->setCurrentFont(QFont("Times New Roman", 12));	//整体设置字体

QString temp = "xxx";
ui->msgBrowser->append("<font color=\"#FF0000\">" + temp + "</font>");	//追加xxx(红色)
ui->msgBrowser->append("<font color=\"#00FF00\">" + temp + "</font>");	//追加xxx(绿色)
ui->msgBrowser->append("<font color=\"#0000FF\">" + temp + "</font>");	//追加xxx(蓝色)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

十一、QString截取字符串

QString::mid

QString mid(int position, int n = -1) const;	//函数原型
//position: 开始下标
//n: 截取长度

//示例
QString str;
QString csv = "0;1;2;3;4;5";

str = csv.mid(0,1);	//0
str = csv.mid(0,2);	//0;
str = csv.mid(0,3);	//0;1
str = csv.mid(0,4);	//0;1;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

QString::section

QString section(QChar sep, int start, int end = -1, SectionFlags flags = SectionDefault) const;	//函数原型
//sep:分隔字符
//start:开始切割的位置
//end: 结束切割的位置
//flags: 切割行为定义

//示例
QString str;
QString csv = "0;1;2;3;4;5";

str = csv.section(;,0,0);	//1
str = csv.section(;,1,1);	//2
str = csv.section(;,2,3);	//2;3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

QString::split

QStringList split(QChar sep, SplitBehavior behavior = KeepEmptyParts,Qt::CaseSensitivity cs = Qt::CaseSensitive) const;	//函数原型
//sep: 分隔字符

//示例
QStringList list;
QString csv = "0;1;2;3;4;5";

list = csv.split(';');	
//list[0] = '0';
//list[1] = '1';
//list[2] = '2';
//list[3] = '3';
//list[4] = '4';
//list[5] = '5';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

十二、隐藏鼠标

qApp->setOverrideCursor(Qt::BlankCursor);
  • 1

十三、枚举值与字符串互转

class Cenum : public QObject
{
    Q_OBJECT
public:
    Cenum(){}

    enum ElementType
    {
        one,
        two,
        three
    };
    Q_ENUM(ElementType)
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
qDebug()<<"Cenum::one: "<<Cenum::one;                                     
qDebug()<<"======================";                                       
QMetaEnum metaEnum = QMetaEnum::fromType<Cenum::ElementType>();           
qDebug()<<"Cenum::one: "<<metaEnum.valueToKey(Cenum::one);  //enum转QString
qDebug()<<"Cenum::one: "<<metaEnum.keysToValue("one");      //QString转enum
  • 1
  • 2
  • 3
  • 4
  • 5

十四、QMainWindow添加菜单栏、工具栏、状态栏

void MainWindow::CreateMenuBar()
{
    QMenuBar * menuBar = new QMenuBar(this);

    QMenu * menuFile = new QMenu("File", this);
    QAction * newFile = new QAction(QIcon(), "NewFile", this);
    QAction * openFile = new QAction(QIcon(), "OpenFile", this);
    QAction * save = new QAction(QIcon(), "Save", this);
    menuFile->addAction(newFile);
    menuFile->addAction(openFile);
    menuFile->addAction(save);

    QMenu * menuEdit = new QMenu("Edit", this);
    QAction * cut = new QAction(QIcon(), "Cut", this);
    QAction * copy = new QAction(QIcon(), "Copy", this);
    QAction * paste = new QAction(QIcon(), "Paste", this);
    menuEdit->addAction(cut);
    menuEdit->addAction(copy);
    menuEdit->addAction(paste);

    menuBar->addMenu(menuFile);
    menuBar->addMenu(menuEdit);

    this->setMenuBar(menuBar);
}

void MainWindow::CreateToolBar()
{
    QToolBar * toolBar1 = new QToolBar(this);
    toolBar1->setObjectName("toolBar1");
    QAction * action1_1 = new QAction("action1_1", this);
    QAction * action1_2 = new QAction("action1_2", this);
    QAction * action1_3 = new QAction("action1_3", this);
    QAction * action1_4 = new QAction("action1_4", this);
    toolBar1->addAction(action1_1);
    toolBar1->addAction(action1_2);
    toolBar1->addAction(action1_3);
    toolBar1->addAction(action1_4);

    QToolBar * toolBar2 = new QToolBar(this);
    toolBar2->setObjectName("toolBar2");
    QAction * action2_1 = new QAction("action2_1", this);
    QAction * action2_2 = new QAction("action2_2", this);
    QAction * action2_3 = new QAction("action2_3", this);
    QAction * action2_4 = new QAction("action2_4", this);
    toolBar2->addAction(action2_1);
    toolBar2->addAction(action2_2);
    toolBar2->addAction(action2_3);
    toolBar2->addAction(action2_4);

    QToolBar * toolBar3 = new QToolBar(this);
    toolBar3->setObjectName("toolBar3");
    QAction * action3_1 = new QAction("action3_1", this);
    QAction * action3_2 = new QAction("action3_2", this);
    QAction * action3_3 = new QAction("action3_3", this);
    QAction * action3_4 = new QAction("action3_4", this);
    toolBar3->addAction(action3_1);
    toolBar3->addAction(action3_2);
    toolBar3->addAction(action3_3);
    toolBar3->addAction(action3_4);

    this->addToolBar(toolBar1);
    this->addToolBar(toolBar2);
    this->addToolBar(toolBar3);
}

void MainWindow::CreateStatusBar()
{
    //创建状态栏
    QStatusBar *status = new QStatusBar(this);
    status->setObjectName("status");
    status->setObjectName("状态栏");
    status->setStyleSheet("QStatusBar::item{border: 0px}"); //设置不显示label的边框

    //主窗口添加状态栏
    this->setStatusBar(status);

    //创建标签
    QLabel *statusLabel = new QLabel("我是状态栏", this);

    //状态栏添加信息
    status->showMessage("我在3秒后会消失", 3000);//显示在左侧,并且3秒后自动消失

    status->addPermanentWidget(statusLabel);//添加右侧标签(永久性)
}
  • 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
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85

十五、禁用中文输入法

this->setAttribute(Qt::WA_InputMethodEnabled,false);
  • 1
#include <windows.h>
#pragma  comment(lib, "User32.lib")

HKL  hCurKL;
void disableIME();
void enableIME();
//----------------------------------------------------------------------
void Widget::disableIME()
{
    hCurKL = GetKeyboardLayout(0);
    LoadKeyboardLayout((LPCWSTR)QString("0x0409").utf16(), KLF_ACTIVATE);
}

void Widget::enableIME()
{
    ActivateKeyboardLayout(hCurKL, 0);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

十六、使用QStringList设置QSS

QStringList qss;
qss.append(QString("background-color: red;"));
qss.append(QString("border: none;"));
this->setStyleSheet(qss.join(""));
  • 1
  • 2
  • 3
  • 4

十七、QLabel文字显示不全省略

//函数原型
QString QFontMetrics::elidedText(const QString &text, Qt::TextElideMode mode, int width, int flags = 0) const

第二个参数为文本缩略后,省略号所在的位置,可选:
Qt::ElideLeft    	0     省略号应出现在文本的开头;
Qt::ElideRight    	1     省略号应出现在文本的末尾;
Qt::ElideMiddle    	2     省略号应出现在文本的中间;
Qt::ElideNone    	3     省略号不应出现在文本中;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
//使用示例
QString str = ui->label->text();
QFontMetrics metrics(ui->label->font());
if (metrics.width(str) > ui->label->width()) {
	str = QFontMetrics(ui->label->font()).elidedText(str, Qt::ElideRight, ui->label->width());
}
ui->label->setText(str);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

十八、拷贝文件、文件夹


//拷贝文件:
bool MyTest007::copyFileToPath(QString sourceDir ,QString toDir, bool coverFileIfExist)
{
	toDir.replace("\\","/");
	if (sourceDir == toDir){
		return true;
	}
	if (!QFile::exists(sourceDir)){
		return false;
	}
	QDir *createfile     = new QDir;
	bool exist = createfile->exists(toDir);
	if (exist){
		if(coverFileIfExist){
			createfile->remove(toDir);
		}
	}//end if
 
	if(!QFile::copy(sourceDir, toDir))
	{
		return false;
	}
	return true;
}
  • 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
//拷贝文件夹:
bool MyTest007::copyDirectoryFiles(const QString &fromDir, const QString &toDir, bool coverFileIfExist)
{
	QDir sourceDir(fromDir);
	QDir targetDir(toDir);
	if(!targetDir.exists()){    /**< 如果目标目录不存在,则进行创建 */
		if(!targetDir.mkdir(targetDir.absolutePath()))
			return false;
	}
 
	QFileInfoList fileInfoList = sourceDir.entryInfoList();
	foreach(QFileInfo fileInfo, fileInfoList){
		if(fileInfo.fileName() == "." || fileInfo.fileName() == "..")
			continue;
 
		if(fileInfo.isDir()){    /**< 当为目录时,递归的进行copy */
			if(!copyDirectoryFiles(fileInfo.filePath(), 
				targetDir.filePath(fileInfo.fileName()),
				coverFileIfExist))
				return false;
		}
		else{            /**< 当允许覆盖操作时,将旧文件进行删除操作 */
			if(coverFileIfExist && targetDir.exists(fileInfo.fileName())){
				targetDir.remove(fileInfo.fileName()); 
			}
 
			/// 进行文件copy
			if(!QFile::copy(fileInfo.filePath(), 
				targetDir.filePath(fileInfo.fileName()))){
					return false;
			}
		}
	}
	return true;
}
  • 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

[附] 复制文件、移动文件

文件复制

bool x= QFile::copy(old_name,new_name);
qDebug()<<x;
  • 1
  • 2

文件移动(剪切)

QString old_name="路径A";
QString new_name="新路径A";
bool x= QFile::rename(old_name,new_name); //A路径移动到B路径
qDebug()<<x;
  • 1
  • 2
  • 3
  • 4

重命名之前,文件已经在我程序的其他模块中被使用了,使用中的文件是不能重命名的(win平台下).
补充:遇到无法移动的bug,尝试手动移动文件后在执行程序成功


十九、删除文件或者文件夹

清空文件夹内所有文件或者文件夹

void clearAllFileAndDir(const QString& path)
{
	if(path.isEmpty()) {
		return;
	}
	
	QDir dir(path);
	if(!dir.exist()) {
		return;
	}

	QDirIterator DirsIterator(path, QDir::Files | QDir::AllDirs | QDir::NoDotAndDotDot, QDirIterator::NoIteratorFlags);
    while(DirsIterator.hasNext()) {
        if (!Dir.remove(DirsIterator.next())) {	// 删除文件操作如果返回否,那它就是目录
            QDir(DirsIterator.filePath()).removeRecursively(); // 删除目录本身以及它下属所有的文件及目录
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

删除文件夹或者文件

bool MainWindow::DeleteFileOrFolder(const QString& strPath) //要删除的文件夹或文件的路径
{
    if (strPath.isEmpty() || !QDir().exists(strPath)) //是否传入了空的路径||路径是否存在
        return false;

    QFileInfo FileInfo(strPath);

    if (FileInfo.isFile()) //如果是文件
        QFile::remove(strPath);
    else if (FileInfo.isDir()) //如果是文件夹
    {
        QDir qDir(strPath);
        qDir.removeRecursively();
    }
    return true;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
//--1 判断文件夹是否存在
QString folderPath = "H:\\Pro";
QDir dir(folderPath);
if(!dir.exists())
{
    QMessageBox::critical(this,tr("错误"),tr("文件夹找不到"));
    return;
}

//--2 获取当前路径下所有的文件夹名字
QStringList names = dir.entryList(QDir::Dirs);

//--3 删除当前文件夹和上级文件夹(温馨提示:隐藏的文件夹获取不了)
names.removeOne(".");
names.removeOne("..");
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

二十、Qt使用HTML显示文字

1、QLabel的文本显示是支持html标签的,使用html有时候能很便捷的实现一些效果,例如:显示超链接

ui->label->setText(tr("Learn more please visit: <a style=color:#32bc84; href = http://www.baidu.com>www.baidu.com</a>"));
  • 1

添加信号槽,使得点击能够跳转

connect(ui->label, &QLabel::linkActivated, this, [=](const QString& link){
	QDesktopServices::openUrl(QUrl(link));
});
  • 1
  • 2
  • 3

2、QPainter绘制一些复杂的文字时,尤其是各种奇奇怪怪的复杂格式,而这些格式用html确很好描述,比如控制行间距、字符间距等,此时可以用QTextDocument传入html格式内容交给QPainter绘制

void Form::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    QTextDocument doc;
    doc.setHtml(html);
    //设置文本宽度
    doc.setTextWidth(200);
    //指定绘制区域
    doc.drawContents(&painter, QRect(0, 0, 200, 70));
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

二十一、隐藏菜单项

ui->menu->menuAction()->setVisible(false);
  • 1

二十二、Qt等宽字体

在这里插入图片描述


二十二、拷贝文件、文件夹

//拷贝文件:
bool MyTest007::copyFileToPath(QString sourceDir ,QString toDir, bool coverFileIfExist)
{
	toDir.replace("\\","/");
	if (sourceDir == toDir){
		return true;
	}
	if (!QFile::exists(sourceDir)){
		return false;
	}
	QDir *createfile     = new QDir;
	bool exist = createfile->exists(toDir);
	if (exist){
		if(coverFileIfExist){
			createfile->remove(toDir);
		}
	}//end if
 
	if(!QFile::copy(sourceDir, toDir))
	{
		return false;
	}
	return true;
}
 
//拷贝文件夹:
bool MyTest007::copyDirectoryFiles(const QString &fromDir, const QString &toDir, bool coverFileIfExist)
{
	QDir sourceDir(fromDir);
	QDir targetDir(toDir);
	if(!targetDir.exists()){    /**< 如果目标目录不存在,则进行创建 */
		if(!targetDir.mkdir(targetDir.absolutePath()))
			return false;
	}
 
	QFileInfoList fileInfoList = sourceDir.entryInfoList();
	foreach(QFileInfo fileInfo, fileInfoList){
		if(fileInfo.fileName() == "." || fileInfo.fileName() == "..")
			continue;
 
		if(fileInfo.isDir()){    /**< 当为目录时,递归的进行copy */
			if(!copyDirectoryFiles(fileInfo.filePath(), 
				targetDir.filePath(fileInfo.fileName()),
				coverFileIfExist))
				return false;
		}
		else{            /**< 当允许覆盖操作时,将旧文件进行删除操作 */
			if(coverFileIfExist && targetDir.exists(fileInfo.fileName())){
				targetDir.remove(fileInfo.fileName()); 
			}
 
			/// 进行文件copy
			if(!QFile::copy(fileInfo.filePath(), 
				targetDir.filePath(fileInfo.fileName()))){
					return false;
			}
		}
	}
	return true;
}
  • 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
  • 56
  • 57
  • 58
  • 59
  • 60

二十三、窗口置顶(但不是霸道置顶)

widget->activateWindow();
widget->setWindowState((widget->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
  • 1
  • 2

二十四、获取鼠标位置

获取鼠标相对于电脑屏幕的坐标

QCursor().pos()
  • 1

获取鼠标相对于窗口的坐标

int x=widget->mapFromGlobal(QCursor().pos()).x();
int y=widget->mapFromGlobal(QCursor().pos()).y();
  • 1
  • 2

二十五、Widget鼠标悬浮事件

qwtPlot->setAttribute(Qt::WA_Hover,true);//开启悬停事件
qwtPlot->installEventFilter(this);       //安装事件过滤器

//事件过滤器
bool TT::eventFilter(QObject *obj, QEvent *event)
{
    if(obj == qwtPlot) {
        if(event->type() == QEvent::HoverMove) {
            //QPointF pos1 = QCursor().pos();   //获取鼠标相对于屏幕的坐标
            QPointF pos1 = QPointF(qwtPlot->mapFromGlobal(QCursor().pos()).x(),qwtPlot->mapFromGlobal(QCursor().pos()).y());    //获取鼠标相对于qwtPlot窗口的坐标
            QPointF pos2 = QPointF(-1,-1);
            QwtScaleMap xMap = qwtPlot->canvasMap(QwtPlot::xBottom);    //窗口坐标转换为画布坐标
            QwtScaleMap yMap = qwtPlot->canvasMap(QwtPlot::yLeft);
            pos2.setX(xMap.invTransform(pos1.x()));
            pos2.setY(yMap.invTransform(pos1.y()));
            qDebug()<< "屏幕坐标: " << pos1 << "    画布坐标: "<<pos2;
            return true;
        }
    }
    return QWidget::eventFilter(obj,event);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

二十六、QLabel显示图片

QString totalFilePath = QCoreApplication::applicationDirPath() + "/config/para_image/" + str_para_image;
if(totalFilePath.isEmpty()) {
	return;
}

QFile file_para_image(totalFilePath);
if(!file_para_image.exists()) {
	return;
}

QPixmap *pixmap = new QPixmap(totalFilePath);
pixmap->scaled(para_image->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
label->setScaledContents(true);
label->setPixmap(*pixmap);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

二十七、获取文件夹下的指定类型文件

QStringList Page::fileNameInDir(QString path,QString filter)	//多种文件过滤使用';'分隔,例如:fileNameInDir("c:/Image","*.png;*.jpg");
{
    QStringList string_list;

    //判断路径是否存在
    QDir dir(path);
    if(!dir.exists()) {
        return string_list;
    }

    //查看路径中后缀为.png格式的文件
    QStringList filters = filter.split(';');
    dir.setFilter(QDir::Files | QDir::NoSymLinks); //设置类型过滤器,只为文件格式
    dir.setNameFilters(filters);  //设置文件名称过滤器,只为filters格式

    //统计cfg格式的文件个数
    int dir_count = dir.count();
    if(dir_count <= 0) {
        return string_list;
    }

    //存储文件名称
    for(int i=0; i<dir_count; i++) {
        QString file_name = dir[i];  //文件名称
        string_list.append(file_name);
    }

    return string_list;
}
  • 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

二十八、按空格解析字符串

[]:包含一系列字符
\s:匹配任意的空白符
+:匹配1次或多次

QStringList List = lineStr.split(QRegularExpression("[\\s]+"), QString::SkipEmptyParts);
  • 1

二十九、计算DPI设置控件尺寸

/**************************************************
 * 刷新dpi,获取当前屏幕状态,并伸缩所用控件的大小
 * 只在窗口构造函数中调用,因此,改变屏幕分辨率需要重新启动软件
 *************************************************/
void MainWindow::refreshDPI()
{
    //计算dpi
    QList<QScreen*> screens = QApplication::screens();
    QScreen* screen = screens[0];
    qreal dpi = screen->logicalDotsPerInch();
    qDebug()<<"dpi="<<dpi;

    //计算dpi对应的缩放比例
    double objectRate = dpi / 96.0;
    //myobjectRate = objectRate;
    changeObjectSize(*this, objectRate);
    resize(width()*objectRate, height()*objectRate);
}
/**************************************************
 * 根据屏幕清空调整控件大小
 *************************************************/
void MainWindow::changeObjectSize(const QObject& Obj, double objectRate)
{
    for(int i=0; i<Obj.children().size(); ++i) {
        QWidget* pWidget{nullptr};
        pWidget = qobject_cast<QWidget*>(Obj.children().at(i));
        if(pWidget != nullptr) {
            pWidget->setGeometry(pWidget->x()*objectRate, pWidget->y()*objectRate,
                                 pWidget->width()*objectRate, pWidget->height()*objectRate);
            changeObjectSize(*(Obj.children().at(i)), objectRate);
        }
    }
}
  • 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

三十、检测Windows是否安装某软件

bool MainWindow::HasIntStall(QString softName)
{
    if(softName.isEmpty()) {
        return false;
    }

    QString header = "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\";
    QSettings reg(header,QSettings::NativeFormat);
    QStringList sum = reg.allKeys();
    for(int m  = 0 ; m < sum.size();++m){
        QString id = sum.at(m);
        QStringList strList=id.split("/");
        QSettings gt(header + strList[0],QSettings::NativeFormat);
        QString name = gt.value("DisplayName").toString();
        if(name.contains(softName)) {
            qDebug()<<"name: "<<name;
            return true;
        }
    }

    return false;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/962417
推荐阅读
相关标签
  

闽ICP备14008679号