实现了一个QWidget的子类名为mainWindow,
class mainWindow : public QWidget
{
Q_OBJECT
public:
explicit mainWindow ();
~mainWindow () override;
protected:
virtual void resizeEvent(QResizeEvent *event) override;
}
刚开始接触qt的时候会犯如下错误
void showMainWindow(){
mainWindow a;
a.show();
}
这种写法在a.show()之后,临时变量a就释放掉了,所以会一闪而过,所以要new一个对象出来。
void showMainWindow(){
mainWindow *a = new mainWindow();
a->show();
}
确定不是这种新手的错误后,再仔细研究如下代码导致的闪退
mainWindow* pWin = new mainWindow();
qDebug()<<"before show";
pWin->show();
qDebug()<<"after show";
调用show之前有打印,show之后的打印没有出来
经过代码注释,最后定位到闪退发生在resizeEvent里面
void mainWindow::resizeEvent(QResizeEvent *event) {
QPoint pos = QWidget::mapToGlobal(this->pos());
QRect dskRect = QGuiApplication::screenAt(pos)->geometry();
// 。。。。。
}
大致的意思时获取当前窗口在哪块屏幕上,因为遇到过客户那边多显示器的情况,为了体验,会判断当前窗口的左上角在哪个screen上,然后做对应的操作。
在本地调试的时候没有任何问题,客户那里也只有一块显示器,从代码看只能是
QGuiApplication::screenAt(pos)
返回nullptr才可能出问题,因为没有定义临时变量接收返回值,dmp文件也没定位到这个地方,趁次机会留作记录。
void mainWindow::resizeEvent(QResizeEvent *event) {
QPoint pos = QWidget::mapToGlobal(this->pos());
QScreen* pCurScreen = QGuiApplication::screenAt(pos);
if(pCurScreen){
QRect dskRect = pCurScreen->geometry();
// 。。。。。
}
}