Qt常用方法总结

UI界面常用接口、编码转换显示中文、配置文件读写、获取主窗口指针、qt全局信号、判断操作系统类型、判断是debug还是release、调用cmd命令行程序、QProcess调用外部exe程序、github访问加速、Qt常用gitignore、Qt调用A4打印机、QImage与Base64相互转换等

目录

  • 通用
  • UI界面
  • 透明与半透明窗口
  • 判断当前系统是windows还是linux
  • pro工程文件判断当前编译环境是debug还是release
  • 编码转换,显示中文
  • QSettings读写配置文件
  • 获取主窗口指针
  • Qt全局信号
  • Qt调用命令行程序
  • 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

UI界面

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);

判断当前系统是windows还是linux

pro工程文件中判断:

win32{
#windows系统
}
unix{
#linux系统
}

代码中判断

#ifdef Q_OS_LINUX
//linux系统
#endif

#ifdef Q_OS_WIN32
//windows系统
#endif

pro工程文件判断当前编译环境是debug还是release

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读写配置文件

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 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)
//刷新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;
}

你可能感兴趣的:(QT,qt)