Qt常用代码笔记

窗口设置

setAttribute(Qt::WA_TranslucentBackground);	//设置成透明的,背景色都没了
setWindowFlags(Qt::WindowStaysOnTopHint);	//始终显示在顶层
setWindowFlags(Qt::FramelessWindowHint);	//去掉边框

QDialog设置圆角

QDialog里添加QFrame

QDialog设置:
setAttribute(Qt::WA_TranslucentBackground); 
setWindowFlags(Qt::FramelessWindowHint);

QFrame设置border-radius

截屏API

1. QPixmap pixmap = QPixmap::grabWindow(QApplication::desktop()->winId());
2. QPixmap pixmap = QApplication::primaryScreen()->grabWindow(0);

计算时间差,用于log

1.
QTime start = QTime::currentTime();
qDebug() << "duration: " << QTime::currentTime().msecTo(start) <<"ms";

2.
qDebug() << "duration: " << start.elapsed() << "ms";

Qwidget及其子类设置样式

QWidget在Designer样式表中设置样式没有生效,使用官网推荐方法: 
void CustomWidget::paintEvent(QPaintEvent *)
 {
     QStyleOption opt;
     opt.init(this);
     QPainter p(this);
     style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
 }
 
 然后加载全局样式表:
     QFile file("./Global.qss");
    if (file.open(QIODevice::ReadOnly))
    {
        QString style(file.readAll());
        app.setStyleSheet(style);
        file.close();
        qDebug() << QStringLiteral("加载全局样式表完成");
    }
    else
    {
        qDebug() << "QFile open failed";
        return 0;
    }

QLineEdit默认有边框,用setFrame(false);取消边框

qt生成翻译文件

lupdate.exe -verbose -pro test.pro -ts test_zh.ts

类型转换

int转QString:
int i=1; QString::number(i);
QString转int:
QString s; s.toInt();

qt android每次构建的时候,assets目录都会被覆盖,导致某些资源文件被删除了。

解决办法:在.pro文件加上 ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android

然在.pro文件目录下添加android目录,在android目录添加assert目录,把相应的资源放进android/assets目录下。那么构建的时候会自动将android目录下的内容更新到构建目录android-build/内,这样就能保证.qss,.qm等文件一次添加就行了,之后部署都能生效。

16进制QString转unsigned char数组

unsigned char* hexQstringToUnsignedCharArray(const QString& str)
{
    int len = str.size();
    if (len != 12)
        return nullptr;

    unsigned char* arr = new unsigned char[6];
    for (int i = 0; i < 6; ++i)
    {
        QString hexString = str.mid(i * 2, 2);
        bool ok = false;
        arr[i] = (unsigned char)hexString.toUShort(&ok, 16);
        if (!ok)
        {
            qDebug() << "convert failed";
            delete[] arr;
            return nullptr;
        }
    }
    return arr;
}

//方法2
void hexQstringToUnsignedCharArray(const QString& strMac, QVector<unsigned char>& vecMac)
{
    for (int i = 0; i < strMac.size(); i += 2)
    {
        QString num = strMac.mid(i, 2);
        bool ok = false;
        vecMac.push_back(num.toUInt(&ok, 16));
        if (!ok)
        {
            qDebug() << "convert failed";
            vecMac.clear();
            return;
        }
    }
}

void qstringToUnsignedCharArray()
{
    QString strMac = "F4C8EDF6C048";

    qDebug() << "origin mac: " << strMac;

    QVector<unsigned char> vecMac;
    hexQstringToUnsignedCharArray(strMac, vecMac);
    if (vecMac.size() != 6)
        return;

    const unsigned char* arr = vecMac.data();

    char buf[1024] = { 0 };
    sprintf_s(buf, 1024, "%02X %02X %02X %02X %02X %02X", arr[0], arr[1], arr[2], arr[3], arr[4], arr[5]);
    qDebug() << "transfered mac: " << buf;
}

打印当前线程id

stringstream ss;
ss << this_thread::get_id();
cout << ss.str();
qDebug() << QStringLiteral("当前线程id:%1").arg(QString::fromStdString(ss.s_str()));

设置UAC(开启管理员权限,可以在C盘写文件)

1. 创建program.manifest文件,输入如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="X86"
    name="mulitray.exe.manifest"
    type="win32"
/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
        <requestedPrivileges>
            <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
        </requestedPrivileges>
    </security>
</trustInfo>
</assembly>

2. 在program.rc文件中添加一行1 24 program.manifest

3. .pro文件添加RC_FILE = program.rc

以后Qt Creator也要用管理员权限启动了,最好将Qt Creator设置默认要求管理员权限。

QMenu demo

方法1:
QMenu *settingMenu = new QMenu();
QAction *act = new QAction(tr("检查更新"));
settingMenu->addAction(act);
ui->btn_setting->setMenu(settingMenu);

方法2:重写contextMenuEvent事件
声明:
void contextMenuEvent(QContextMenuEvent *event) Q_DECL_OVERRIDE;

实现:
void CPage2::contextMenuEvent(QContextMenuEvent *event)
{
    QMenu menu;
    menu.addAction(ui->act_setting);
    menu.exec(event->globalPos());
}

方法3:
QMenu settingMenu;
settingMenu.addAction(ui->act_setting);
settingMenu.exec(QCursor::pos());

.user文件添加Qt路径

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup />
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <QTDIR>C:\Software\Qt\Qt5.14.1\5.14.1\msvc2017</QTDIR>
    <LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <QTDIR>C:\Software\Qt\Qt5.14.1\5.14.1\msvc2017</QTDIR>
    <LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>
  </PropertyGroup>
</Project>

重启程序时将登录窗口QDialog显示在最前面

    QTimer::singleShot(100, [this]() {
        raise();
        activateWindow();
    });

Qt将窗口置顶

setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);

windows API将窗口置顶和取消置顶


        HWND hwnd = (HWND)this->winId();
        DWORD dwstyle = ::GetWindowLong(hwnd, GWL_EXSTYLE);
        DWORD err = GetLastError();
        if (dwstyle & WS_EX_TOPMOST)
        {
            dwstyle &= ~WS_EX_TOPMOST;
            ::SetWindowLong(hwnd, GWL_EXSTYLE, dwstyle);
            ::SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOREPOSITION | SWP_NOSIZE | SWP_SHOWWINDOW);
        }
        else
        {
            dwstyle |= WS_EX_TOPMOST;
            ::SetWindowLong(hwnd, GWL_EXSTYLE, dwstyle);
            ::SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOREPOSITION | SWP_NOSIZE | SWP_SHOWWINDOW);
        }

控件隐藏时保持占位

void setRetainSizeWhenHidden(QWidget* w, bool isRetain)
{
    QSizePolicy policy = w->sizePolicy();
    policy.setRetainSizeWhenHidden(isRetain);
    w->setSizePolicy(policy);
}

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值