Qt界面常用接口、Qt编码转换显示中文、Qt配置文件读写、Qt获取主窗口指针、qt全局信号、Qt判断操作系统类型、Qt判断是debug还是release、Qt调用cmd命令行程序、QProcess调用外部exe程序、github访问加速、Qt常用gitignore、Qt调用A4打印机、QImage与Base64相互转换等, QLabel播放gif,Qt设置半透明gif
目录
通用
qt在线看源码
https://code.woboq.org/qt5/
QApplication::alert(this);//qt让任务栏图标闪动
QApplication::beep();//windows自带告警声音,调用一次响一次,需包含头文件<QApplication>
//如果要在Qt信号槽中使用自定义类型,需要注意使用qRegisterMetaType对自定义类型进行注册
qRegisterMetaType<MyClass>("Myclass&")
qApp->closeAllWindows();//关闭窗口,退出程序
qApp->quit();//退出程序,必须在a.exec()之后调用才能生效
//重启程序
qApp->quit();
QProcess::startDetached(qApp->applicationFilePath(), QStringList());
//捕获窗口的停用与激活,在eventFilter事件过滤器中实现
QEvent::WindowDeactivate//不活动窗口事件
QEvent::WindowActivate//活动窗口事件
//QT在槽函数中获取信号发送者的指针
QCheckBox* p_sender = qobject_cast<QCheckBox*>(sender());
//程序运行前执行环境,会打印加载插件时的调试信息
export QT_DEBUG_PLUGINS=1
#添加到pro文件,修改生成的可执行文件名,windows生成myapp.exe,linux生成myapp
TARGET=myapp
QT翻译家
pro文件添加:TRANSLATIONS = language_cn.ts
QT程序开发,把要翻译的字符串使用tr(“hello”)包裹
编译代码,QtCreator点击工具-外部-QT语言家-Update Translations,在pro文件夹生成 language_cn.ts(工程大时稍等一会)
QT安装目录或开始菜单打开对应编译器的Qt Linguist程序,在程序中打开 language_cn.ts文件,选择目标语言,会自动扫描需要翻译的字段,进行翻译。
翻译完成后,Linguist程序,文件-发布,在 language_cn.ts文件夹生成 language_cn.qm文件。
在main函数QApplication a(argc, argv);后加载翻译文件,编译运行后界面显示翻译后的字段。
QTranslator *qtTranslator = new QTranslator();
bool ret = qtTranslator->load("./language_cn.qm");
qApp->installTranslator(qtTranslator);
UI界面
show();//显示窗口
hide();//隐藏窗口
isVisible();//窗口是否可见
showFullScreen();//全屏显示
showNormal();//回退正常显示
showMinimized();//最小化窗口
showMaximized();//最大化窗口
setWindowFlags(Qt::FramelessWindowHint);//隐藏标题边框
//隐藏标题边框,同时可以点击任务栏最小化
setWindowFlags(Qt::Window |Qt::FramelessWindowHint |Qt::WindowSystemMenuHint |Qt::WindowMinimizeButtonHint|Qt::WindowMaximizeButtonHint);
resize(600,400);//重置窗口大小
setFixedSize(600,400);//窗口显示固定大小,不能缩放
setMinimumSize(600,400);//设置窗口最小尺寸
setMaximumSize(600,400);//设置窗口最大尺寸
this->setCursor(Qt::BlankCursor); //隐藏鼠标
this->setCursor(Qt::ArrowCursor); //显示鼠标
ui->pushButton_close->setCursor(QCursor(Qt::PointingHandCursor));//悬浮控件鼠标变小手
//qt获取屏幕大小
QScreen *screen=QGuiApplication::primaryScreen ();//不包含任务栏的屏幕大小
QRect scrRect=screen->availableGeometry() ;
int screen_width = scrRect.width();
int screen_height = scrRect.height();
QDesktopWidget* desktopWidget = QApplication::desktop();//设备屏幕的总大小,包含任务栏
QRect screenRect = desktopWidget->screenGeometry();
double screenX = screenRect.width();
double screenY = screenRect.height();
//窗口显示在最前
this->setWindowFlags(this->windowFlags() | Qt::WindowStaysOnTopHint);
this->showNormal();
//取消显示在最前
this->setWindowFlags(this->windowFlags() & ~Qt::WindowStaysOnTopHint);
this->showNormal();
//上述方法有时不生效,或者界面闪,windows可用下面方法:
#include <windows.h>
::SetWindowPos(HWND(this->winId()), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);//显示最前
::SetWindowPos(HWND(this->winId()), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);//取消显示最前
//超长字符串显示省略号,QFontMetrics可以测量字符串的高度和宽度,微软雅黑等字体计算英文宽度有误,建议使用默认字体
QFontMetrics metrics(ui->label_->font());
if (metrics.width(text) > ui->label_->width())
text = QFontMetrics(ui->label_->font()).elidedText(text, Qt::ElideRight, ui->label_->width());
ui->label_->setText(text);
//按钮1秒只能点一次
ui->pushButton_camera->setEnabled(false);
QTimer::singleShot(1000, this, [=]() { ui->pushButton_camera->setEnabled(true);});
透明与半透明窗口
使用环境不一样,代码也不一样,多尝试才能得到想要的效果
setStyleSheet ("background-color: rgb(0,0,0, 200)");//设置背景黑色,透明度200
setWindowOpacity(0.5);//设置窗口透明度,整个窗口所有控件半透明
setAttribute(Qt::WA_TranslucentBackground, true);//设置窗口背景透明
//设置窗口背景半透明,控件不透明,需要重写
void QDialog_MBOX::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.fillRect(this->rect(), QColor(0, 0, 0, 150)); //QColor最后一个参数80代表背景的透明度
}
//windows下需要设置一下,否则不生效
setWindowFlags(Qt::ToolTip | Qt::FramelessWindowHint);
QLabel播放gif,设置半透明gif
当前类继承于QLabel
//播放gif
pGIF = new QMovie("./config_meeting/images/loading.gif");
pGIF->setParent(this);
this->setMovie(pGIF);
//实现gif半透明
void tranLabel::paintEvent(QPaintEvent *)
{
QStyle *style = QWidget::style();
QPainter painter(this);
painter.setOpacity(0.4);
//drawFrame(&painter);
QRect cr = contentsRect();
cr.adjust(margin(), margin(), -margin(), -margin());
int align = QStyle::visualAlignment(text() == "" ? Qt::LeftToRight : layoutDirection(), alignment());
if (movie())
{
if (hasScaledContents())
style->drawItemPixmap(&painter, cr, align, movie()->currentPixmap().scaled(cr.size()));
else
style->drawItemPixmap(&painter, cr, align, movie()->currentPixmap());
}
}
判断当前系统是windows还是linux
pro工程文件中判断:
win32{
#windows系统
}
unix{
#linux系统
}
代码中判断,在非QT的C++系统中,可以用上面的unix/WIN32
#ifdef Q_OS_LINUX
//linux系统
#endif
#ifdef Q_OS_WIN32
//windows系统
#endif
pro工程文件判断当前编译环境是debug还是release
CONFIG(debug, debug|release) {
#debug
} else {
#release
}
编码转换,显示中文
#include <QTextCodec>
//转换编码,在Qt程序里显示中文
QString Instance::gbkToUnicode(const char *chars)
{
QTextCodec *gbk= QTextCodec::codecForName("GBK");
QString str = gbk->toUnicode(chars);//获取的字符串可以显示中文
return str;
}
//Qt输出字符串到外部程序,在外部程序显示中文
QByteArray Instance::gbkFromUnicode(QString str)
{
QTextCodec *gbk = QTextCodec::codecForName("gbk");
return gbk->fromUnicode(str);
}
QSettings读写配置文件
QSettings *pSettings;
pSettings = new QSettings("./config/VideoCallHljVTM_kfCfg.ini",QSettings::IniFormat);
//解决中文乱码,配置文件是UTF-8编码格式,如果是GB2312则设置成GB2312
pSettings->setIniCodec(QTextCodec::codecForName("UTF-8"));
QString port= pSettings->value("SYS_PARAM/Video_RevLocal_Port","errorString").toString();//读配置文件
pSettings->setValue("SYS_PARAM/BusinessServerIP",ui->lineEdit_ip->text());//写配置文件
获取主窗口指针
vckfMainWindow *Instance::getMainWindow()//vckfMainWindow替换为自定义的MainWindow
{
foreach (QWidget *w, qApp->topLevelWidgets())
{
if(vckfMainWindow* mainwin = qobject_cast<vckfMainWindow*>(w))
{
return mainwin;
}
}
return nullptr;
}
Qt全局信号
QT的提供了很多全局的信号,在程序的任何位置都可以接收处理
void focusChanged(QWidget *old, QWidget *now)
void applicationStateChanged(Qt::ApplicationState state)
void commitDataRequest(QSessionManager &manager)
void focusObjectChanged(QObject *focusObject)
void focusWindowChanged(QWindow *focusWindow)
void fontDatabaseChanged()
void lastWindowClosed()
void layoutDirectionChanged(Qt::LayoutDirection direction)
void paletteChanged(const QPalette &palette)
void primaryScreenChanged(QScreen *screen)
void saveStateRequest(QSessionManager &manager)
void screenAdded(QScreen *screen)
void screenRemoved(QScreen *screen)
connect(qApp, SIGNAL(focusChanged(QWidget *, QWidget *)), this, SLOT(myFocusChanged(QWidget *, QWidget *)));
Qt调用命令行程序
windows,cmd执行命令,并获取输出
#include <QProcess>
QProcess t_Process;//应用程序类
t_Process.setProcessChannelMode(QProcess::MergedChannels);
t_Process.start("cmd");//启动cmd程序,传入参数
bool isok = t_Process.waitForStarted();
qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<" "<<isok;//打印启动是否成功
QString command1 = "ipconfig";
t_Process.write(command1.toLatin1().data());//执行命令
t_Process.closeWriteChannel();//关闭输入通道
t_Process.waitForFinished();
QString strTemp=QString::fromLocal8Bit(t_Process.readAllStandardOutput());//获取程序输出
t_Process.close();//关闭程序
linux系统
QProcess *cmd;
cmd = new QProcess(this);
cmd->start("bash");
cmd->waitForStarted();
connect(cmd , SIGNAL(readyReadStandardOutput()) , this , SLOT(on_readoutput()));
connect(cmd , SIGNAL(readyReadStandardError()) , this , SLOT(on_readerror()));
QString cmdstr = QString("echo %1 | sudo -S chmod 666 /dev/tty*\n").arg("password");
cmd->write(cmdstr.toLatin1().data());//执行命令
//获取cmd正常输出
void on_readoutput()
{
qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<" "<<cmd->readAllStandardOutput().data();
}
//获取cmd报错输出
void on_readerror()
{
qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<" "<<cmd->readAllStandardError().data();
}
QProcess调用外部exe程序
QProcess *pRemoteCtrProcess;
pRemoteCtrProcess = new QProcess(this);
connect(pRemoteCtrProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotpRemoteCtrFinished(int, QProcess::ExitStatus)));
pRemoteCtrProcess->start("./Teacher/Teacher.exe");//启动外部程序
pRemoteCtrProcess->close();//关闭外部程序
//外部程序关闭时触发该槽函数
void slotpRemoteCtrFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
QString exitStr = QString("软件退出,exitCode=%1,ExitStatus=%2.").arg(QString::number(exitCode)).arg(exitStatus);
qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<" "<<exitStr;
github访问加速
查询访问github.com最快的IP:
https://www.ipaddress.com/
https://github.com.ipaddress.com/www.github.com
在hosts添加140.82.113.3 github.com(C:\Windows\System32\drivers\etc)(sudo vim /etc/hosts)
//刷新DNS
ipconfig /flushdns
Qt常用.gitignore
*.user
debug
release
*.Debug
*.Release
*.stash
Qt调用A4打印机
QT使用QPrinter类调用普通A4打印机,ubuntu和windows通用,需要正确安装打印机驱动,设置打印机为默认打印机即可;ubuntu需要安装cups服务,访问http://localhost:631/printers/配置打印机。
注意,在软件发布以后可能会打印失败,比如报错:QPainter::begin(): Returned false,Painter not active等,这是缺少依赖库导致的,把QT安装目录下/opt/Qt5.12.2/5.12.2/gcc_64/plugins/printsupport这个文件夹拷贝到可执行程序同级目录即可。
QPrinter printerPixmap;
// QPixmap pixmap = QPixmap::grabWidget(ui->label_main, ui->label_main->rect()); //打印QLabel
QPixmap pixmap = this->grab(QRect(620,0,708,1001));//从QWidget截图
printerPixmap.setOrientation(QPrinter::Portrait);//纵向:Portrait 横向:Landscape
printerPixmap.setPageSize(QPrinter::A4);//设置纸张大小
QPainter painterPixmap;
painterPixmap.begin(&printerPixmap);
painterPixmap.scale(1, 1);//设置图像长宽是原图的多少倍
painterPixmap.drawPixmap(30, 30 , pixmap);//设置图像在A4中的开始坐标是什么
painterPixmap.end();
QImage与Base64相互转换
//QImage转Base64
QByteArray ImageToBase64(const QImage &image)
{
QByteArray imageData;
QBuffer buffer(&imageData);
image.save(&buffer, "jpg");
imageData = imageData.toBase64();
return imageData;
}
//Base64转QImage
QImage Base64ToImage(const QByteArray &data)
{
QByteArray imageData = QByteArray::fromBase64(data);
QImage image;
image.loadFromData(imageData);
return image;
}
QWidget设置背景色与背景图
背景色
setAutoFillBackground(true); // 这句要加上, 否则可能显示不出背景图.
QPalette palette = this->palette();
palette.setColor(QPalette::Window, color); // 设置背景色
//palette.setBrush(this->backgroundRole(), Qt::black);// 设置背景色
this->setPalette(palette);
背景图
void YangPlayWidgetJZ::paintEvent(QPaintEvent *)
{
setAutoFillBackground(true);
QPalette palette = this->palette();
palette.setBrush(QPalette::Background,QBrush(QPixmap::BgPixmap.scaled(this->size(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation))); // 使用平滑的缩放方式
this->setPalette(palette);
}
QT图片模糊虚化效果
QLabel、QWidget、QPushButton等大部分带界面的控件都可以使用
QGraphicsBlurEffect* m_pBlurEffect = nullptr;
m_pBlurEffect = new QGraphicsBlurEffect;
m_pBlurEffect->setBlurRadius(5);//模糊半径,半径越大,模糊效果越明显
m_pBlurEffect->setBlurHints(QGraphicsBlurEffect::PerformanceHint);
ui->label_bg->setGraphicsEffect(m_pBlurEffect);//设置
QT超长文字显示省略号
适用于QLabel、QPushButton等设置文本。
void RecordMainWindow::label_setText(QString text)
{
QFontMetrics metrics(ui->label_UserName->font());
if (metrics.width(text) > ui->label_UserName->width())
{
text = QFontMetrics(ui->label_UserName->font()).elidedText(text, Qt::ElideRight, ui->label_UserName->width());
}
ui->label_UserName->setText(text);
}