Object::connect: No such slot
- 检查类是否继承于 QObject
- 检查类声明的开始处是否添加 Q_OBJECT
- 检查是否使用 slots 关键字进行槽声明
最小化窗口重新打开界面假死/冻结
解决方法:重写showEvent事件即可,这个问题在自定义标题栏的时候遇到过。
void showEvent(QShowEvent *e){
this->setAttribute(Qt::WA_Mapped);
QWidget::showEvent(e);
}
Qt Lingiust国际化翻译部分地方不起作用
原因:tr的原型是QString QObject::tr(const char * sourceText, const char * disambiguation = 0, int n = -1),即类中如果没有定义Q_OBJECT,tr是不识别的。
解决方法:确保在定义了Q_OBJECT的前提下使用tr()。
继承QWidget或其他基类时出现error: 'show' is a private member of 'QWidget'
解决方法:继承的时候忘了加public:,粗心的时候就容易出这个错,且查不到原因
// 继承时一定要加 public !!!
class FS_Color_Dialog : public QColorDialog
{
Q_OBJECT
public:
FS_Color_Dialog(QWidget *widget = Q_NULLPTR);
};
编译出错:-1: error: [ui_mainwindow.h] Error
解决方法:
- 检查程序所在路径是否包含中文,路径要为全英文;
- 检查程序所在的文件夹名称,是否含有括号()及其他宽七八糟的符号。比如程序所在的文件夹叫test(02),在windows下可以跑,但在Linux下就会报这个错,并且编译器的输出如下图所示。
在Linux下编译qml出现error: Unknown module(s) in QT: qml quick - Qt Creator
解决方案:安装上qtdeclarative5-dev即可,安装指令:
sudo apt install qtdeclarative5-dev
使用QSS设置ID选择器时,通过代码新建的控件样式无效
原因:代码生成的控件无默认objectName(),需手动设置objectName()
在VS中中文乱码
解决方法,加上下面这一句到cpp中
#pragma execution_character_set("utf-8")
继承QDialog后出现setGeometry: Unable to set geometry
原因:父对象几何框架较小不能容纳下子类视图,所以导致了对父对象的重新构造。
解决方法:在构造函数中添加如下代码
this->setWindowFlags(Qt::WindowCloseButtonHint | Qt::MSWindowsFixedSizeDialogHint);
QComboBox的匿名信号槽实现
connect(ui.comboBox, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), [=](int index)
{
// to do
});
QWidget::setLayout: Attempting to set QLayout "" on xxx "", which already has a layout
原因:在创建Layout的时候使用了this指针,隐式的设置了这个QWidget的布局
解决方法:设置一遍布局即可
// 错误示范
auto layout = new QHBoxLayput(this); // 隐式设置布局
this->setLayout(layout); // 显示设置布局
// 正确做法
auto layout = new QHBoxLayput(this);
//或者
auto layout = new QHBoxLayput;
this->setLayout(layout);
setAttribute(Qt::WA_DeleteOnClose)导致内存泄露:debug assertion failed _crtisvalidheappointer(block)
原因:定义在栈上的窗口被销毁了两次,退出main方法时,会自动销毁窗口,而setAttribute方法会使得Qt再次销毁窗口,造成二次delete,产生报错。
解决方法:将窗口定义在堆上,如下面代码所示
MainWindow *w = new MainWindow ;
w->show();
获取到的控件尺寸错误
原因:在构造函数的时候,控件的大小还未确定
解决方法:在构造完成后再获取,或者重载resizeEvent事件。
QTableView/QTableWidget安装了事件过滤器无效的问题
原因:QTableView/QTableWidget派生于QAbstractScollArea,过滤器要安装在viewport中
ui->tableView->viewport()->installEventFilter(this);
bool XX类名::eventFilter(QObject* watched, QEvent* e)
{
if (watched == table->viewport())
{
}
}
QObject::connect: No such slot xxx
原因:没有在派生类中写Q_OBJECT宏
QListWidget在IconMode下使用setItemWidget导致item位置错乱
原因:Item在Layout过程中,代理中updateEditorGeometry采用的style计算的位置有问题
解决方法:为QListWidget设置Delegate,覆写updateEditorGeometry方法(不手动给QListWidget设置Delegate时,QT也会自动给QListWidget设置默认的Delegate)
// CustomDelegate.h
#pragma once
#include <QStyledItemDelegate>
class CustomDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
CustomDelegate(QWidget *parent = Q_NULLPTR) { };
virtual ~CustomDelegate() { };
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
editor->setGeometry(option.rect);
;
};
// 构造函数中
CustomDelegate *delegate = new CustomDelegate(this);
ui->listWidget_Video->setItemDelegate(delegate);