自定義了一個標題欄,存在(最大化(恢復正常),最小化,關閉)等按鈕。
界面中存在一系列布局,其中包括一個QGroupBox,這個QGroupBox中是水平布局,存在兩個QLabel,一個用來顯示攝像頭,一個用來顯示資訊。
界面事件處理用的事件過濾器eventFilter。
最近遇到這么一個問題,運行程式后,點擊最大化按鈕后使表單最大化,再次點擊使表單恢復原來大小,但是其中用來顯示攝像頭的QLabel大小變了,不是正常界面中的大小。還有就是,在事件過濾器eventFilter中實作了雙擊攝像頭QLabel會使他全屏顯示,再次雙擊恢復原來大小,這個功能也有問題,跟上面的問題一樣,都是放大恢復后不是原始大小。我覺得兩個問題可能是一個原因導致的,大佬們幫我看看是怎么回事呀。
bool MainWindow::eventFilter(QObject *o, QEvent *e)
{
QMouseEvent* ev=static_cast<QMouseEvent *>(e);
if(e->type()==QEvent::MouseMove)//滑鼠移動
{
if(!isMax)
{
//只要滑鼠移動就更改滑鼠樣式,并檢測滑鼠是否在邊框上
setMouseStyle(getMouseArea(ev->pos()));
//判斷是否按下標題移動
if(mousePressed)
{
QWidget* pw=this->childAt(pressedPoint);
if(pw==ui->my_title||pw==ui->ico)
{
move(this->pos()+ev->globalPos()-pressedPoint2);
pressedPoint2=ev->globalPos();
}
}
if(ischange)
{
changeWidgetSize(ev->globalPos());
}
}
}
else if((o==ui->centralWidget)&&(e->type()==QEvent::MouseButtonPress))//邊框滑鼠按下
{
if(curEvent!=NON)//如果在邊框上并且按下左鍵
{
ischange=true;
m_StartGeometry=this->geometry();
}
}
else if(e->type()==QEvent::MouseButtonRelease)//滑鼠抬起
{
mousePressed = false;
ischange=false;
curEvent=NON;
}
else if((o==ui->my_title)&&e->type()==QEvent::MouseButtonDblClick)//雙擊標題欄
{
if(!isMax)
{
isMax=true;
this->showMaximized();
}
else {
isMax=false;
this->showNormal();
}
}
else if((o==ui->my_title||o==ui->ico)&&e->type()==QEvent::MouseButtonPress)//標題按下
{
if(ev->button()==Qt::LeftButton)
{
mousePressed = true;
pressedPoint = ev->pos();//相對于表單中滑鼠的位置
pressedPoint2= ev->globalPos();//相對于桌面中滑鼠的位置
}
}
else if((o==ui->wenduchartview)&&(e->type()==QEvent::MouseButtonDblClick))//雙擊溫度濕度圖
{
if(ui->wenduchartview->isFullScreen())
{
ui->wenduchartview->setWindowFlags(Qt::SubWindow);
ui->wenduchartview->showNormal();
}
else {
ui->wenduchartview->setWindowFlags(Qt::Dialog);
ui->wenduchartview->showFullScreen();
}
}
else if((o==ui->shiduchartview)&&(e->type()==QEvent::MouseButtonDblClick))//雙擊濕度濕度圖
{
if(ui->shiduchartview->isFullScreen())
{
ui->shiduchartview->setWindowFlags(Qt::SubWindow);
ui->shiduchartview->showNormal();
}
else {
ui->shiduchartview->setWindowFlags(Qt::Dialog);
ui->shiduchartview->showFullScreen();
}
}
else if((o==ui->m_camera)&&(e->type()==QEvent::MouseButtonDblClick))//雙擊攝像頭
{
if(ui->m_camera->isFullScreen())
{
ui->m_camera->setWindowFlags(Qt::SubWindow);
ui->m_camera->showNormal();
ui->m_camera->resize(camera_size);
int with = ui->m_camera->width();
int height = ui->m_camera->height();
qDebug()<<"縮小后的寬="<<with<<"縮小后的高="<<height;
}
else {
camera_size=ui->m_camera->size();
camera_rect=ui->m_camera->geometry();
ui->m_camera->setWindowFlags(Qt::Dialog);
ui->m_camera->showFullScreen();
}
}
else if((o==ui->wenduchartview)&&(e->type()==QEvent::Enter))//滑鼠進入彈出提示框
{
ui->wenduchartview->setToolTip("雙擊最大/最小化");
}
else if((o==ui->shiduchartview)&&(e->type()==QEvent::Enter))//滑鼠進入彈出提示框
{
ui->shiduchartview->setToolTip("雙擊最大/最小化");
}
else if((o==ui->m_camera)&&(e->type()==QEvent::Enter))//滑鼠進入彈出提示框
{
ui->m_camera->setToolTip("雙擊最大/最小化");
}
return QWidget::eventFilter(o, e);
}
//最小化
void MainWindow::chickMin()
{
this->showMinimized();
}
//最大化
void MainWindow::chickMax()
{
if(!isMax)//不是最大化,最大化
{
isMax=true;
this->showMaximized();
}
else {
isMax=false;
this->showNormal();
}
}
//關閉
void MainWindow::chickClose()
{
qDebug()<<"點擊關閉";
this->close();
}
uj5u.com熱心網友回復:
你這是要自適應視窗縮放吧,建議在resizeEvent里面實作,視窗大小改變會觸發resizeEvent,當前視窗的大小與視窗初始大小相比得到一個縮放系數,在這個視窗的所有控制元件的大小和位置都乘以這個系數就可以了uj5u.com熱心網友回復:
給你看下效果圖,這是正常界面中的大小
這是點擊最大化并恢復正常后界面中控制元件的大小

其他的部分正常,這個樣子看上去是攝像頭的Label大小撐大了layout,然后下面的折線圖大小讓放大了,為什么使用showNormal()函式不能恢復放大之前的大小呢
uj5u.com熱心網友回復:
把你的控制元件放入layout,最好是gridlayoutuj5u.com熱心網友回復:
控制元件在groupbox中,groupbox中存在布局。我把攝像頭的label設定了一個最小size后是正常了,但是出現問題的原因沒找到,很煩。對了,再問一個問題,QChart中如歌設定X軸在Y軸的中間呢(就是類似一個橫著放的丁字型),我用m_chart->addAxis(axis_x,Qt::AlignCenter); 報錯No alignment specified !ASSERT: "axis" in file axis\qabstractaxis.cpp, line 1064。轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/12263.html
標籤:Qt
上一篇:安卓動態申請存盤權限后仍然permission denied
下一篇:Android后期如何學?
