窗口设置
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);
}