QT 工作遇到的小问题

1.QT中清空布局中所有小控件

addWidget后,如果使用removeWidget,界面上的小控件不会立即消失,可以进行如下操作,布局中的控件都会立即消失

QRadioButton *button = new QRadioButton("血刀老祖");
button->setParent(nullptr);
2.纯代码添加QPushButton,设置样式checked不生效

纯代码添加小控件,基本属性还需要进行设置

QPushButton *btn= new QPushButton(this);
//设置可点击属性
btn->setCheckable(true);
//设置点击
btn->setChecked(true);
//启用自动独占(可实现N个小控件,同一时间只能按一个)
btn->setAutoExclusive(true);
btn->setStyleSheet("QPushButton{background-color:white;"
                                 "font-size:18px;"
                                 "}"
                   "QPushButton:checked{background-color:red;"
                                 "font-size:18px;"
                   "}");
3.stackedWidget必须在初始化时,设置当前页,否则有可能顺序会打乱,画面顺序错误
QButtonGroup *group = new QButtonGroup();
group->setExclusive(true);
group->addButton(ui->btnMember, 0);
group->addButton(ui->btnSettings, 1);
connect(group, SIGNAL(buttonClicked(int)), this, SLOT(onGroupClicked(int)));
ui->stackedWidget->setCurrentIndex(0);
4.有时候Debug项目运行按钮置灰

在这里插入图片描述
解决办法:先切换到Release,在切回到Debug,运行按钮就会变绿
在这里插入图片描述

5.常量中含有换行符

QT–工具–文件编辑器–行为中进行设置。
在这里插入图片描述

6.pro文件出现错误,提示为Extra characters after test expression.
ui/chat/ListForm.cpp \
ui/chat/SettingsForm.cpp 
ui/chat/RoomForm.cpp \

中间的没有转接行,需要加上 \

7.提升后,找不到ui文件

原因:提升的时候,勾选了全局包含。
在这里插入图片描述
正确的做法
第一种:不要勾选
第二种:如果勾选了全局包含,那么在ui_文件中,将<ClassChatSettingsForm.h> 改为 “ClassChatSettingsForm.h”
在这里插入图片描述

8.将一个frame调整为水平居中

在这里插入图片描述

9.安装样式CSS文件,但是界面不生效

使用notepad++将样式文件打开,将文件编码方式改为UTF-8-BOM
在这里插入图片描述

在这里插入图片描述

10.获取不到窗体的正确全局坐标

m_widget窗体必须先show出来,才能获取到它的全局坐标

QPoint  leftTop = m_widget->mapToGlobal(QPoint(0, 0));
11.点击部件或弹窗外部其他位置时消失
setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
setAttribute(Qt::WA_TranslucentBackground);

bool InfoNoticeForm::event(QEvent *ev)
{
    if (QEvent::Show == ev->type())
        activateWindow();
    else if (QEvent::WindowDeactivate == ev->type())
        hide();

    return QWidget::event(ev);
}
12.一运行程序就崩溃
Starting E:\apple.exe...
程序异常结束。
E:\apple.exe crashed.

查看:自己代码中写的setstylesheet()中的语法是否正确,是否有分号

13.无法打开或写入程序

程序进程还在,可重启解决

14.线程执行完一次任务再执行,无反应

创建一个线程,线程执行任务完成以后,才能再去发射start信号,执行任务才会生效。

if (m_thread.isFinished()) {
    m_Thread.start();
}
15.提升的类不需要show,否则会多显示一次,屏幕闪一下
16.程序休眠一会,不影响主UI线程
    //等待五秒
	QEventLoop eventloop;
    QTimer::singleShot(5000, &eventloop, SLOT(quit()));
    eventloop.exec();
界面刷新不及时,两种方法
	// 第一种立即终止当前事件循环
	QTimer::singleShot(0, this, [this]() {
        adjustSize();
    });

	// 第二种
	void showEvent(QShowEvent *event)
	{
    	this->setAttribute(Qt::WA_Mapped);
    	QWidget::showEvent(event);
	}
17.paintEvent如果定义了,里面就算没有画图,此时去设置setStyleSheet是不生效的。如果要生效,应该删除paintEvent定义函数
void paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);
}
18.Qt无法定位程序输入点QXXXX于动态链接库XXXX问题的解决方法

转载: QT解决无法定位程序输入点的问题
原因: 在PATH变量中搜索路径时的顺序问题。比如MinGW编译器的路径在MSVC编译器的路径前面时,这时候你使用MSVC编译器来编译构建项目,这时候在Qt里点击运行是没有问题的。但是如果使用windeployqt xxx.exe然后在文件里双击运行时就会报“无法定位程序输入点QXXXX于动态链接库XXXX问题”。所以改变其顺序。

19.QListWidget默认选中Item,周围会有细线

在这里插入图片描述

QListView {
    background-color: rgb(255, 255, 255);
    color: rgb(51, 51, 51);
    //可以加这一句,即可去掉细线
	outline: 0px;
}

QListView::item {
    padding-left:10px;
	padding-top:5px;
    padding-bottom:5px;
    background-color: rgb(255, 255, 255);
}

QListView::item:selected {
	color: rgb(255, 255, 255);
	background: rgb(45, 126, 244);
}

QListView::item:hover {
    background: rgb(45, 126, 244);
	color: rgb(255, 255, 255);
} 


20.qt中引入的cef无法加载。

背景: 在安装rpm包的机器上cef无法加载,在其他平台都正常,比如deb等。
原因: 因为我们的应用程序中使用的是官网的openssl的官方分支,而rpm系统库自带的ssl来自红帽分支,红帽分支加入了一些特殊的接口,但在openssl的官方分支中并没有。如果应用程序中的cef恰好依赖某个rpm的系统库,而这个系统库又依赖于openssl,那么自带的openssl没有这个接口,就不行了。
解决方法: 在拉取的官方分支中加入该特殊接口的patch。



21、QLineEdit绑定QCompleter后,引起的问题

背景: QCompleter用来实现自动填充功能,方便用户输入,设置completer后,绑定其activated信号,槽函数会传递该事件。
其他类会执行其他操作。但是lineEdit当输入字符,比如"鲁班",那么自动下拉框会出现"鲁班七号",回车选中后,我在其他类执行显示一个模态框,但是由于执行"鲁班七号"时,模态框出现,导致输入框失去了焦点,模态框获取了焦点,QCompleter认为没有处理完该字符串,会将手动输入的"鲁班",再次激活,导致接受了两次字符串更改。"鲁班七号"->"鲁班"

QStringList wordList;
wordList << "鲁班七号" << "百里守约";

QCompleter *completer = new QCompleter(wordList, this);
ui->lineEdit->setCompleter(completer);

connect(completer, SIGNAL(activated(const QString &)), this, SLOT(on_completerActivated(const QString &)));

原因: 模态框抢焦点后,QCompleter因为自己的事件循环被堵塞,没有处理完该次事件。会将之前保存的前缀"鲁班"返回,导致接收方收到两次字符串更改信息。
解决方法: 通过信号和槽的方式,在自己的事件循环中处理该模态框。

// Qt::QueuedConnection连接类型会导致信号的槽函数在接收线程的事件循环中被调用,防止被阻塞。
connect(this, SIGNAL(sigCompleterActivated()), this, SLOT(onCompleterActivated()), Qt::QueuedConnection);


22、在Arm机器上,读取图片崩溃

背景: 打开某个特殊图片时,程序崩溃。并且gdb调试时,每次的崩溃堆栈都不一样,最后都会崩溃到libtcmalloc_minimal.so库中,大部分是和QMap和QList相关,在构造函数中就崩溃了。起初是怀疑内存泄漏,在读取图片后,输出内存大小还有几个G,所以和这个无关。最后只能去调试QImageReader::read。最快的方法是使用打日志的方式,看到底崩溃到了哪一行。
原因: 排查后,和读取图片头无关,该图片经过解压,然后经过一系列的旋转、裁剪、缩放等操作后,在执行Rgb888ToRgb32Converter时崩溃了。由于每个架构的实现方法不同,所以在x64和long64上没有问题,只在arm上有问题。由于有问题的图片其宽度只有1,也就是len为1,但是字节对齐数offsetToAlignOn16Bytes可能比len大,而src的大小是根据本身图片的宽度去申请内存的,也就是在for循环时可能会越界,访问到了其他内存,导致崩溃。
解决方法:

// 问题代码
#if defined(__ARM_NEON__)
Q_GUI_EXPORT void QT_FASTCALL qt_convert_rgb888_to_rgb32_neon(quint32 *dst, const uchar *src, int len)
{
    if (!len)
        return;
    const quint32 *const end = dst + len;
    const int offsetToAlignOn16Bytes = (reinterpret_cast<quintptr>(dst) >> 2) & 0x3;
    for (int i = 0; i < offsetToAlignOn16Bytes; ++i) {
        *dst++ = qRgb(src[0], src[1], src[2]);
        src += 3;
    }
}

// 解决代码
#if defined(__ARM_NEON__)
Q_GUI_EXPORT void QT_FASTCALL qt_convert_rgb888_to_rgb32_neon(quint32 *dst, const uchar *src, int len)
{
    if (!len)
        return;
    const quint32 *const end = dst + len;
    const int offsetToAlignOn16Bytes = (reinterpret_cast<quintptr>(dst) >> 2) & 0x3;
    // 循环以最小申请大小为基准
    for (int i = 0; i < qMin(len, offsetToAlignOn16Bytes); ++i) {
        *dst++ = qRgb(src[0], src[1], src[2]);
        src += 3;
    }
}

tips:在qt官网最新版本6.5中找到了该条记录,https://github.com/qt/qtbase/commit/7eccd7ac1c98e0c15c0b4a13d036a5ef46896d8a 如果想合并该条记录,可以在url后追加".patch",下载下来就可以打patch了。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值