Qt常用方法总结

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

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

QT类图

在这里插入图片描述

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值