Qt日常工作问题点记录1(至2021.03.31)

前言

把工作中遇到的小点记一下。

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、隐藏任务栏程序图标的三种方法。

  1. 众所周知的常见的就是给控件设置父对象。
  2. 同事踩坑学到的,设置SetWindowFlag(Qt::Tool)。
    但是这种设置有个缺点,会影响控件的WindowDeactivate事件。
  3. 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、构造函数内获得某些空间大小不准确。

  1. 构造函数执行后,会触发resizeEvent事件,将处理放置到resizeEvent。
  2. 使用定时器。构造函数中启动定时器,定时器触发处理函数,并关闭定时器。

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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值