Qt小随笔1
目录:
1、设置控件的鼠标
2、打开当前可执行文件的目录
3、Qt中获取系统时间
4、QString按特定字符进行分割字符串(split)
5、Qt中用类QSettings读写配置文件ini
6、Unicode字符和字符串显示为中文
7、Qt模态与非模态对话框
8、Qt调试后右下角的选项卡恢复到原来
1、设置控件的鼠标
当要实现鼠标进入某个控件区域时,鼠标箭头变为手型效果,可以用函数QWidget::setCursor(),其中该函数原型如下所示:void setCursor(const QCursor &);如:
button->setCursor(QCursor(Qt::PointingHandCursor));
如果没有设置或者调用了unsetCursor(),则使用父类的鼠标样式
2、打开当前可执行文件的目录
#include <QDesktopServices> #include <QUrl> void Dialog::openCurDir() { QDesktopServices::openUrl(QUrl::fromLocalFile( QCoreApplication::applicationDirPath())); }
QDesktopServices::openUrl()表示打开指定QString路径的文件夹,QUrl可以通过QUrl::fromLocalFile(QString)转换
QCoreApplication::applicationDirPath()表示获取当前可执行exe所在的目录路径
3、Qt中获取系统时间
Qt中获取系统时间可以用类QDateTime的一个静态函数currentTime(),
qDebug() << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss dddd");
//三秒钟后执行退出(仅执行一次)singleShot仅执行一次
QTimer::singleShot(3000, qApp, SLOT(quit()));
4、QString按特定字符进行分割字符串(split)
QString str = "ab,bb,,cc"; QStringList strList = str.split(",", QString::SkipEmptyParts); foreach (auto& item, strList) { qDebug() << item; }
5、Qt中用类QSettings读写配置文件ini
QSettings有限制,只能存储段-键值对模式,如果需要更复杂格式,需要进行嵌套或者选择xml,json等配置文件
#include <QSettings> void Dialog::on_btnWriteSettings_clicked() { //创建和打开配置文件 QSettings* settingWrite = new QSettings("setting.ini", QSettings::IniFormat); //IniFormat是配置文件,NativeFormat是注册表 //写配置文件 settingWrite->setValue(QString("段1/key1"),QString("这是段1的值1")); settingWrite->setValue(QString("段1/key2"),QString("这是段1的值2")); settingWrite->setValue(QString("段2/key1"),QString("这是段2的值1")); //释放内存 delete settingWrite; settingWrite = nullptr; } void Dialog::on_btnReadSettings_clicked() { //创建和打开配置文件 QSettings* settingRead = new QSettings("setting.ini", QSettings::IniFormat); //读配置文件 auto section1Val = settingRead->value(QString("段1/key1")).toString(); qDebug() << "section1Value1:" <<section1Val; ui->labelKey->setText("段1/key1"); ui->editValue->setText(section1Val); //释放内存 delete settingRead; settingRead = nullptr; }
6、Unicode字符和字符串显示为中文
qt中如果输出一个中文字符,默认输出来的是unicode,如
const QString title = {"日一二三四五六"}; for(int i = 0; i < title.count(); ++ i) { qDebug() << title[i]; }
效果如:
如果要输出为中文,需要调用QString()
const QString title = {"日一二三四五六"}; for(int i = 0; i < title.count(); ++ i) { qDebug() << QString(title[i]); }
效果如:
如果要把BYTE转为中文
#include <QString> #include <QDebug> QString unicode2Chinese(const BYTE *byteArr,const quint16 size) { /*Unicode字符串显示中文,按存储位置小端序存储*/ QChar *pch=new QChar[size/2]; memset(pch,0,size/2); memcpy(pch,byteArr,size); QString txt(pch,size/2); return txt; } void Widget::on_pushButton_2_clicked() { /*单个Unicode字符显示中文*/ QChar ch1=0x5b89; qDebug()<<QString(ch1); /*Unicode字符串显示中文,按存储位置小端序存储*/ BYTE byteArr[]={0x33,0x00,0x36,0x00,0x30 ,0x00 ,0x89 ,0x5B ,0x68 ,0x51 ,0x4F ,0x6D ,0xC8 ,0x89 ,0x68 ,0x56 ,0x0B ,0x4E ,0x7D ,0x8F}; QString fileName=unicode2Chinese(byteArr,sizeof(byteArr)); qDebug ()<<fileName; }
7、Qt模态与非模态对话框
默认情况下Qt的对话框为非模态,及Qt::NonModal
调用函数函数QWidget::setWindowsModality(Qt::WindowModality windowModality)设置显示窗口类型,其中Qt::WindowModality windowModality取值如下:
Qt::NonModal 不阻塞(非模态对话框)
Qt::WindowModal 阻塞父窗口,所有祖先窗口及其子窗口(半模态对话框)(没特殊要求的话,一般用这个)
Qt::ApplicationModal 阻塞整个应用程序(模态对话框)
模态对话框调用
QDialog* dlg = new QDialog(this); dlg->resize(500,300); dlg->setWindowTitle("模态对话框"); dlg->setWindowModality(Qt::WindowModal); dlg->show();
8、Qt调试后右下角的选项卡恢复到原来
多按几次esc就可以关闭这个调试栏,恢复到原来的选项卡