问题记录
- 前言
- 1、QWidget的子类作为其他窗口的子对象时设置qss不生效问题。
- 2、QString->wchar_t
- 3、位运算:开关、标志
- 4、全局热键(Windows)
- 5、TextEdit固定宽度之后,高度随内容变化而变化。
- 6、QLabel支持富文本字符串。
- 7、隐藏任务栏程序图标的三种方法。
- 8、窗口弹出到屏幕最上层,但又可以被其他程序覆盖,不会永远在最上层。
- 9、构造函数内获得某些空间大小不准确。
- 10、paintEvent中的绘制无效。
- 11、代理委托相关。
- 12、QGroupBox中的单选按钮取消选中。
- 13、EventFilter()函数总是需要单击一下控件才能开始检测各种事件。
- 14、VS项目设置Printf函数打印到console窗口进行调试。
- 15、建议:不要使用含义为【是否XXX】的标志位。
- 16、在Windows下,各模块(exe、dll等)之间stl结构不能正常传递,比如str::string。
- 17、重写了QAbstractItemModel之后,在自定义model中的自定义数据结构添加一条数据,QListView显示不出来。
- 18、字符串中斜杠、反斜杠的转换。
- 19、模态进度条弹窗 引起的问题。
- 20、去除QString空格的三种方式。
前言
把工作中遇到的小点记一下。
1、QWidget的子类作为其他窗口的子对象时设置qss不生效问题。
需要再QWidget子类重写paintEvent函数,加如下代码:
void CustomWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
补充方法一:
设置属性 this->setAttribute(Qt::WA_StyledBackground, true);
补充方法二:
改成继承QFrame,因为QFrame自带paintEvent函数已做了实现,在使用样式表时会进行解析和绘制。
2、QString->wchar_t
const wchar_t * encodedName = reinterpret_cast<const wchar_t *>(fileName.utf16());
3、位运算:开关、标志
张三有 B D E 三种状态:ZS = B | D | E
检查张三是否包含状态D: ZS & D == D
取消张三的D状态: ZS = ZS & ~D
4、全局热键(Windows)
注册全局热键Ctrl+Q:
//100是一个唯一标志,包成宏定义保证不重复即可。
RegisterHotKey((HWND)this->winId(), 100, MOD_CONTROL, 'Q');
重写nativeEvent,在函数中监听热键:
bool XXX::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
#ifdef _WIN32
MSG* msg = (MSG*)message;
switch( msg -> message ){
case WM_HOTKEY:
//全局热键监听
if (msg->wParam == 100)
{
((CBillfishManagerWidget*)m_pBillfishMgr)->slotOnShow();
}
break;
}
#endif // _WIN32
return false;
}
5、TextEdit固定宽度之后,高度随内容变化而变化。
Qt QTextEdit固定宽度,高度随内容变化而变化,不会出现滚动条。.
6、QLabel支持富文本字符串。
简便方法:
QLabel->setOpenExternalLinks(true);//可以打开富文本超链接
注:设置无下划线的超链接。
QStringLiteral("<p style=“line-height:40px”>将素材直接移动至素材库所在的文件内,\
避免电脑同时存在2份重复的素材,节省磁盘空间。 <style> a {text-decoration: none} </style><a style='color: blue;' href = www.doshow.com> 不了解区别? 查看教程></a>")
7、隐藏任务栏程序图标的三种方法。
- 众所周知的常见的就是给控件设置父对象。
- 同事踩坑学到的,设置SetWindowFlag(Qt::Tool)。
但是这种设置有个缺点,会影响控件的WindowDeactivate事件。 - this->setWindowFlags(Qt::SubWindow | Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint);
8、窗口弹出到屏幕最上层,但又可以被其他程序覆盖,不会永远在最上层。
有一个将新建窗口生成时弹出到屏幕最上层的需求,最先想到的就是:
setWindowFlags(pMainForm->windowFlags() | Qt::WindowStaysOnTopHint);
但是并不完全符合需求,这种设施导致窗口一致在屏幕最上层,任何程序都无法将其覆盖。
也尝试了:
QWidget::activatedWindows()
不知道为什么不起作用,无法激活到最上层。
最后解决方案(Win)是:
//设置窗口置顶
::SetWindowPos(HWND(pMainForm->winId()), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
::SetWindowPos(HWND(pMainForm->winId()), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
9、构造函数内获得某些空间大小不准确。
- 构造函数执行后,会触发resizeEvent事件,将处理放置到resizeEvent。
- 使用定时器。构造函数中启动定时器,定时器触发处理函数,并关闭定时器。
10、paintEvent中的绘制无效。
低级错误,没有给Painter指定绘制设备。
11、代理委托相关。
给代理createEditor只能双击之后显示自定义控件。
可以直接在代理的paint函数中绘制,达到一直显示自定义控件的目的。
12、QGroupBox中的单选按钮取消选中。
简单的调用setChecked(false)无效。
解决方案。setCheckable(false)->setCheckable(true)->update()。
真的骚。
13、EventFilter()函数总是需要单击一下控件才能开始检测各种事件。
一开始以为是类似setMouseTracking(true)没有设置的问题,但是不是。
其实是因为控件show()出来之后,因为需求问题raise()了一下让其呈现在界面上层,就是这一raise让控件失去了焦点,所以需要调用一下activateWindow()就好了。
14、VS项目设置Printf函数打印到console窗口进行调试。
1、项目名称-》右键属性
2、生成事件-》生成后事件
3、在命令行的右边空白处添加“editbin /SUBSYSTEM:CONSOLE $(OUTDIR)$(ProjectName).exe”,无引号,点击确定。
运行程序时会有命令行窗口弹出,显示Printf打印语句。
15、建议:不要使用含义为【是否XXX】的标志位。
最近使用了含义为【是否隐藏】的标志位,头晕。
16、在Windows下,各模块(exe、dll等)之间stl结构不能正常传递,比如str::string。
听大佬说的,之后再了解一下。
17、重写了QAbstractItemModel之后,在自定义model中的自定义数据结构添加一条数据,QListView显示不出来。
基础不扎实。添加数据结构内容之前需要beginInsertRows和endInsertRows函数。
beginInsertRows(QModelIndex(),rowCount(QModelIndex()),rowCount(QModelIndex()));
m_data.append(str);
endInsertRows();
18、字符串中斜杠、反斜杠的转换。
[static] QString QDir::toNativeSeparators(const QString &pathName)
[static] QString QDir::fromNativeSeparators(const QString &pathName)
19、模态进度条弹窗 引起的问题。
既然【进度条弹窗】是模态的,就不假思索的用了exec,毫无疑问这是错误的,因为exec实现了模态但是也阻止了主线程的运行。
然后思路就变成了:在主线程使用【进度条弹窗】的exec阻塞主线程,另起一个线程处理耗时操作,然后通知进度条,耗时操作完成,解除exec的阻塞。这个思路操作起来比较麻烦。
更好一些的思路:【进度条弹窗】使用setModal设置模态状态,并用show()显示,这样既实现了模态,又不会阻塞主线程 ,更不用另起线程了。
但是在进度条窗口show()或exec()的过程中遇到了一些问题:show或exec之后并不会立马弹出窗口。
解决方案:show或exec之后调用QApplication::processEvent();
20、去除QString空格的三种方式。
1、去除全部空格
str.remove(QRegExp("\\s"));
2、去除首尾全部空格,中间的空格多个空格时只保留且只保留1个
str.simplified();
3、 只去除首尾空格
str.trimmed();