Qt 工作笔记
记录一些工作中的QT经验
有错还望指正 - 勿喷,谢谢
PRO 工程文件
强制添加工程外的文件
QMAKE_CXXFLAGS += /FI"$$PWD/*******.*"
查看宏的值
message(QMAKE_CXXFLAGS)
使用环境变量
$$(ENVI_NAME)
添加第三方库
一般包含库的时候会去掉 前面的 lib (如果有的话), 这个时候可能项目编译不过,
这个时候试着 将 lib 保留, 编译试试
结论 - 工程配置的时候库的名字不要去掉 lib
比如配置了环境变量 BOOST_PATH
BOOST_PATH: boost所在的绝对路径 (目录结构图下图)
win32:LIBS += -L"$$(BOOST_PATH)/lib/x64"
-llibboost_thread-vc142-mt-gd-x64-1_75
! 注意 工程编译不过的时候
Release 版本输出日志问题 - 某些宏没有开启
Release版本的输出却没有文件、行数等信息。
原因是:文件信息、行数等信息在Release版本默认舍弃。我们只要在.pro文件定义一个宏
**
DEFINES += QT_MESSAGELOGCONTEXT
DEFINES += QT_MESSAGELOGCONTEXT
**
然后,重新qmake,编译(有可能要删除掉之前编译的中间文件),就可以在Release版本中正确输出日志信息
拖拽文件到QT应用
使能拖拽
setAcceptDrops(true);
重写拖拽相关事件
virtual void dragEnterEvent(QDragEnterEvent *event)
{
if(true/*满足条件*/)
event->acceptProposedAction(); // 接收后释放鼠标才会触发 dropEvent
else {
event->ignore(); // 不接受鼠标事件
}
}
void dropEvent(QDropEvent *event)
{
// 干你想干的事
}
槽函数内 sender() 值为 nullptr
出现的原因
- 对象被删除, 待确认(但可以往这方面找问题)
- connect采用了一下格式
connect(sendObj, signal,recvObj, slot); // 注意无接收对象。
解决办法
- 改用 有接收对象的即可
connect(sendObj, signal, recvObj, slot); // 注意无接收对象。
Qt Assistant 风格自定义
- 准备 qss(可以是.qss, .txt, 或者没有后缀 等等文本 对就是文本) 文件
- 打开系统命令 执行 assistant.exe -stylesheet 准备的 ‘qss’ 文件即可
如: qtinstanlldir\assistant.exe -stylesheet dark.qss
QTableWidget 表头(含左上角文字显示)
1. 左上角添加文字
1)QAbstractButton*btn = m_tableWidget->findChild<QAbstractButton*>();
if (btn)
{
btn->setText(QStringLiteral("要添加的文字"));
btn->installEventFilter(this); // 重要的
}
2)重写 eventFilter事件
if (e->type() == QEvent::Paint)
{
QAbstractButton *btn = qobject_cast<QAbstractButton*>(o);
if (btn)
{
// paint by hand (borrowed from QTableCornerButton)
QStyleOptionHeader opt;
opt.init(btn);
QStyle::State state = QStyle::State_None;
if (btn->isEnabled())
state |= QStyle::State_Enabled;
if (btn->isActiveWindow())
state |= QStyle::State_Active;
if (btn->isDown())
state |= QStyle::State_Sunken;
opt.state = state;
opt.rect = btn->rect();
opt.text = btn->text(); // this line is the only difference to QTableCornerButton
opt.position = QStyleOptionHeader::OnlyOneSection;
opt.textAlignment = Qt::AlignCenter;
QStylePainter painter(btn);
painter.drawControl(QStyle::CE_Header, opt);
return true;
}
}
return false;