UI界面常用接口、编码转换显示中文、配置文件读写、获取主窗口指针、qt全局信号、判断操作系统类型、判断是debug还是release、调用cmd命令行程序、QProcess调用外部exe程序、github访问加速、Qt常用gitignore、Qt调用A4打印机、QImage与Base64相互转换等
QApplication::alert(this);//qt让任务栏图标闪动
QApplication::beep();//windows自带告警声音,调用一次响一次,需包含头文件
//如果要在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
show();//显示窗口
hide();//隐藏窗口
isVisible();//窗口是否可见
showFullScreen();//全屏显示
showNormal();//回退正常显示
showMinimized();//最小化窗口
showMaximized();//最大化窗口
setWindowFlags(Qt::FramelessWindowHint);//隐藏标题边框
resize(600,400);//重置窗口大小
setFixedSize(600,400);//窗口显示固定大小,不能缩放
setMinimumSize(600,400);//设置窗口最小尺寸
setMaximumSize(600,400);//设置窗口最大尺寸
//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
::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);//取消显示最前
使用环境不一样,代码也不一样,多尝试才能得到想要的效果
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);
pro工程文件中判断:
win32{
#windows系统
}
unix{
#linux系统
}
代码中判断
#ifdef Q_OS_LINUX
//linux系统
#endif
#ifdef Q_OS_WIN32
//windows系统
#endif
CONFIG(debug, debug|release) {
#debug
} else {
#release
}
#include
//转换编码,在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 *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的提供了很多全局的信号,在程序的任何位置都可以接收处理
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 *)));
windows,cmd执行命令,并获取输出
#include
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 *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.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)
//刷新DNS
ipconfig /flushdns
*.user
debug
release
*.Debug
*.Release
*.stash
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
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;
}