赞
踩
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;
}
运行软件后,任务栏一般都会有一个软件的图标,使用此行代码可以将任务栏窗口图标隐藏起来
#include <Windows.h>
system("shutdown -s -t 00"); //关机
system("shutdown -r -t 00"); //重启
system("shutdown -l -t 00"); //注销
-t
: 指令执行延时时间,例如system("shutdown -s -t 00");
就是马上关机。
应用程序可执行文件所在目录
QString applicationDirPath = QCoreApplication::applicationDirPath();
应用程序可执行文件的文件路径
QString applicationFilePath = QCoreApplication::applicationFilePath();
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();
用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();
QByteArray转QString
QByteArray bytes("hello world");
QString data = bytes; // QByteArray转QString方法1
QString转QByteArray
QString data("yudabo");
QByteArray bytes = data.toUtf8(); // QString转QByteArray方法1
QString data("yudabo");
QByteArray bytes = data.toLatin1(); // QString转QByteArray方法2
//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()<<"按钮按下!";
});
//设置字体
QFont font;
font.setFamily("Microsoft YaHei");
font.setPointSize(8);
QFontMetrics fm(font);
QRect rec = fm.boundingRect("这是要获取宽度和高度的字符串");
//字符串所占的像素宽度,高度
int textWidth = rec.width();
int textHeight = rec.height();
void sleep(int sectime)
{
QTime dieTime = QTime::currentTime().addMSecs(sectime);
while (QTime::currentTime() < dieTime) {
QCoreApplication::processEvents(QEventLoop::AllEvents, maxtime);
}
}
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;
}
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(蓝色)
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;
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
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';
qApp->setOverrideCursor(Qt::BlankCursor);
class Cenum : public QObject
{
Q_OBJECT
public:
Cenum(){}
enum ElementType
{
one,
two,
three
};
Q_ENUM(ElementType)
};
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
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);//添加右侧标签(永久性)
}
this->setAttribute(Qt::WA_InputMethodEnabled,false);
#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);
}
QStringList qss;
qss.append(QString("background-color: red;"));
qss.append(QString("border: none;"));
this->setStyleSheet(qss.join(""));
//函数原型
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 省略号不应出现在文本中;
//使用示例
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);
//拷贝文件:
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;
}
文件复制
bool x= QFile::copy(old_name,new_name);
qDebug()<<x;
文件移动(剪切)
QString old_name="路径A";
QString new_name="新路径A";
bool x= QFile::rename(old_name,new_name); //A路径移动到B路径
qDebug()<<x;
重命名之前,文件已经在我程序的其他模块中被使用了,使用中的文件是不能重命名的(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(); // 删除目录本身以及它下属所有的文件及目录
}
}
}
删除文件夹或者文件
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 判断文件夹是否存在
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、QLabel的文本显示是支持html标签的,使用html有时候能很便捷的实现一些效果,例如:显示超链接
ui->label->setText(tr("Learn more please visit: <a style=color:#32bc84; href = http://www.baidu.com>www.baidu.com</a>"));
添加信号槽,使得点击能够跳转
connect(ui->label, &QLabel::linkActivated, this, [=](const QString& link){
QDesktopServices::openUrl(QUrl(link));
});
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));
}
ui->menu->menuAction()->setVisible(false);
//拷贝文件:
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;
}
widget->activateWindow();
widget->setWindowState((widget->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
获取鼠标相对于电脑屏幕的坐标
QCursor().pos()
获取鼠标相对于窗口的坐标
int x=widget->mapFromGlobal(QCursor().pos()).x();
int y=widget->mapFromGlobal(QCursor().pos()).y();
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);
}
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);
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;
}
[]:包含一系列字符
\s:匹配任意的空白符
+:匹配1次或多次
QStringList List = lineStr.split(QRegularExpression("[\\s]+"), QString::SkipEmptyParts);
/**************************************************
* 刷新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);
}
}
}
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;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。