1. 1. lambda作为槽函数导致的问题
  2. 2. EventFilter操作数次后无法捕获某一信号的问题
  3. 3. QT信号槽触发顺序随机和溢出导致的段错误

qt开发过程中遇到的一些问题

lambda作为槽函数导致的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
connect(pbtn, &QPushButton::clicked, this, &TagList::HandleDelete);
// 如果使用lambda表达式就无法正常删除btn,原因待查
// connect(pbtn, &QPushButton::clicked, [&](){
// // QPushButton* clickedBtn = qobject_cast<QPushButton*>(sender());
// scroll_layout_ -> removeWidget(clickedBtn);
// this -> DropAction(std::prev(actions.end()));
// scroll_layout_ -> update();
// scroll_widget_ -> repaint();
// delete clickedBtn;
// });

void TagList::HandleDelete() {
QPushButton* clickedBtn = qobject_cast<QPushButton*>(sender());
scroll_layout_ -> removeWidget(clickedBtn);
this -> DropAction(std::prev(actions.end()));
scroll_layout_ -> update();
scroll_widget_ -> repaint();
delete clickedBtn;
}

EventFilter操作数次后无法捕获某一信号的问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool MainWindow::eventFilter(QObject *watched, QEvent *event) {
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
QDateTime dateTime = QDateTime::currentDateTime();
qDebug() << "Captured" << dateTime .toString("yyyy-MM-dd hh:mm:ss") << "type is: " << event -> type();
if (event -> type() == QEvent::ShortcutOverride) {
if (keyEvent -> key() == Qt::Key_Right) {
Forward1f();
} else if (keyEvent -> key() == Qt::Key_Left) {
Back1f();
}
return true;
}
return QWidget::eventFilter(watched, event);
}

操作单侧方向键多次之后无法再次捕获,需要点击此部件内按钮后才能继续捕获
将事件处理器由子部件上升到父部件,问题解决
原因未查明,推测是多次操作后触发某部件特性导致事件被拦截,可能和事件的传输顺序有关

QT信号槽触发顺序随机和溢出导致的段错误

执行代码到这一步的时候发现有概率会发生段错误,但不是稳定复现

1
2
3
4
for(int i=0;i<images_.size() - 1;i++) {
qDebug() << images_.size() << i;
current_index[i] = time%images_[i].size();
}

刚开始是一位如果另一条事件链先触发,此时images[i]是空的
修复了这个问题之后还是报错,遂打印日志,惊奇的发现日志输出如下

1
2
3
4
0 1
0 2
0 3
0 4

循环的条件为 __ i < images_.size()-1__,但打印出来的结果是i为1234,但size()为0
于是看了一下images_.size()的类型,为size_type(aka unsigned long)
真相大白,原来是为size()为0的时候-1溢出了

也就是说,如果另一条事件链先触发,size()不会是0,因此不会溢出
如果是这条事件链触发的时候,images_里有内容,也不会段错误
只有当这条事件链触发,且images_为空的时候,才会段错误