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);
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]是空的
修复了这个问题之后还是报错,遂打印日志,惊奇的发现日志输出如下
循环的条件为 __ i < images_.size()-1__,但打印出来的结果是i为1234,但size()为0
于是看了一下images_.size()的类型,为size_type(aka unsigned long)
真相大白,原来是为size()为0的时候-1溢出了
也就是说,如果另一条事件链先触发,size()不会是0,因此不会溢出
如果是这条事件链触发的时候,images_里有内容,也不会段错误
只有当这条事件链触发,且images_为空的时候,才会段错误