<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Qt事件過濾器之eventFilter函數返回值

      一、Bug描述

      在編寫一個ip輸入的自定義控件時,對某些鍵盤事件進行特殊處理,編寫了如下代碼:

      IPLineEdit.cpp
      #include "iplineedit.h"
      #include <QSizePolicy>
      #include <QHBoxLayout>
      #include <QLabel>
      #include <QRegExp>
      #include <QRegExpValidator>
      #include <QEvent>
      #include <QKeyEvent>
      
      IPLineEdit::IPLineEdit(QWidget *parent)
          :QLineEdit(parent)
      {
          QHBoxLayout *hboxLayout = new QHBoxLayout(this);
          hboxLayout->setContentsMargins(1,1,1,1);
      
          QRegExp regExp("(25[0-5]|2[0-4][0-9]|1?[0-9]{1,2})");
      
          QLabel *labelDot[3];
          for (int i=0;i<IP_INPUT_SIZE;i++) {
              m_lineEdit[i] = new QLineEdit(this);
      
              m_lineEdit[i]->setProperty("ip", true);
      
              //保存線條編輯是否使用邊框繪制本身
              m_lineEdit[i]->setFrame(false);
              m_lineEdit[i]->setStyleSheet("background-color: white; color: black;");
      
              //輸入框最大位數
              m_lineEdit[i]->setMaxLength(3);
              //消除布局中的空隙,居中
              m_lineEdit[i]->setAlignment(Qt::AlignCenter);
      
              //保存小部件的默認布局
              m_lineEdit[i]->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
      
              //添加驗證規則
              m_lineEdit[i]->setValidator(new QRegExpValidator(regExp,this));
      
              //安裝事件過濾器, 過濾子控件事件,截獲控件按鍵,鼠標事件
              m_lineEdit[i]->installEventFilter(this);
      
              hboxLayout->addWidget(m_lineEdit[i]);
      
              if (i<3) {
                  labelDot[i] = new QLabel(this);
                  labelDot[i]->setText(".");
                  labelDot[i]->setFixedWidth(2);
                  hboxLayout->addWidget(labelDot[i]);
              }
      
              this->setReadOnly(true);
      
              m_lineEdit[0]->setFocus();
              m_lineEdit[0]->selectAll();
          }
      }
      
      IPLineEdit::~IPLineEdit()
      {
      
      }
      
      bool IPLineEdit::eventFilter(QObject *obj, QEvent *event)
      {
          if (children().contains(obj) && QEvent::KeyPress == event->type()) {
      
              QKeyEvent *keyEvent = dynamic_cast<QKeyEvent*>(event);
              QLineEdit *pCurrentEdit = qobject_cast<QLineEdit*>(obj);
      
              switch (keyEvent->key()) {
              case Qt::Key_0:
              case Qt::Key_1:
              case Qt::Key_2:
              case Qt::Key_3:
              case Qt::Key_4:
              case Qt::Key_5:
              case Qt::Key_6:
              case Qt::Key_7:
              case Qt::Key_8:
              case Qt::Key_9:
              {
                  QString strText = pCurrentEdit->text();
                  if (strText.length() <=3 && strText.toInt()*10 > 255) {
                      int index = getIndex(pCurrentEdit);
                      if (index !=-1 && index !=3) {
                          m_lineEdit[index+1]->setFocus();
                          m_lineEdit[index+1]->selectAll();
                      }
                  }
                  return false;
                  // bool b = QLineEdit::eventFilter(obj, event);
                  // return QLineEdit::eventFilter(obj, event);
              }
              break;
              case Qt::Key_Left:
              {
                  if (!pCurrentEdit->cursorPosition()) {
                      int index = getIndex(pCurrentEdit);
                      if (index != -1 && index !=0) {
                          m_lineEdit[index-1]->setFocus();
                          int length = m_lineEdit[index-1]->text().length();
                          m_lineEdit[index-1]->setCursorPosition(length?length:0);
                      }
                  }
      
                  return QLineEdit::eventFilter(obj, event);
              }
              break;
              case Qt::Key_Right:
              {
                  if (!pCurrentEdit->cursorPosition()) {
                      int index = getIndex(pCurrentEdit);
                      if (index != -1 && index !=3) {
                          m_lineEdit[index+1]->setFocus();
                          int length = m_lineEdit[index+1]->text().length();
                          m_lineEdit[index+1]->setCursorPosition(length?length:0);
                      }
                  }
      
                  return QLineEdit::eventFilter(obj, event);
              }
              break;
              case Qt::Key_Backspace: //后退鍵
              {
                  QString strText = pCurrentEdit->text();
                  if (strText.isEmpty()) {
                      int index = getIndex(pCurrentEdit);
                      if (index != -1 && index !=0) {
                          m_lineEdit[index-1]->setFocus();
                          int length = m_lineEdit[index-1]->text().length();
                          m_lineEdit[index-1]->setCursorPosition(length?length:0);
                      }
                  }
      
                  return QLineEdit::eventFilter(obj, event);
              }
              break;
              case Qt::Key_Period: //就是一個點號(.)
              {
                  int index = getIndex(pCurrentEdit);
                  if (index != -1 && index !=3) {
                      m_lineEdit[index+1]->setFocus();
                      m_lineEdit[index+1]->selectAll();
                  }
      
                  return QLineEdit::eventFilter(obj, event);
              }
              break;
              default:
                  return false;
              }
          }
      }
      
      int IPLineEdit::getIndex(QLineEdit *pLineEdit)
      {
          int index = -1;
          for (int i=0;i<IP_INPUT_SIZE;i++) {
              if (pLineEdit == m_lineEdit[i]) {
                  index = i;
              }
          }
          return index;
      }
      
      QString IPLineEdit::text()
      {
          //獲取IP地址
          //192.168.1.1
          QString ip;
          for (int i=0;i<IP_INPUT_SIZE;i++) {
              ip.append(m_lineEdit[i]->text());
              if (3!=i) {
                  ip.append(".");
              }
          }
          return ip;
      }
      
      
      
      IPLineEdit.h
      #ifndef IPLINEEDIT_H
      #define IPLINEEDIT_H
      
      #include <QLineEdit>
      #include <QWidget>
      
      #define IP_INPUT_SIZE 4
      
      class IPLineEdit : public QLineEdit
      {
      public:
          IPLineEdit(QWidget *parent =0);
          ~IPLineEdit();
      
          QString text();
      
      
      protected:
          bool eventFilter(QObject *watched, QEvent *event);
      
      private:
          QLineEdit *m_lineEdit[IP_INPUT_SIZE];
          int getIndex(QLineEdit *pLineEdit);
      
      };
      
      #endif // IPLINEEDIT_H
      
      
      代碼中將編輯框的背景設置成了黑色,但最后的運行結果卻顯示樣式表未起作用如下圖

      1

      二、原因分析

      在Qt的事件處理系統中,eventFilter函數需要正確處理事件傳遞。當在eventFilter中處理特定事件后,必須決定是否將事件傳遞給基類或其他事件處理器。

      在原始代碼中,eventFilter函數在處理完特定按鍵事件后,沒有明確返回QLineEdit::eventFilter(obj, event),這可能導致事件處理鏈中斷。

      三、解決方法

      在重寫的eventFilter函數最后添加返回
      return QLineEdit::eventFilter(obj, event);
      最后運行便能正確設置樣式

      2

      posted @ 2025-08-13 17:29  十里八鄉有名的俏佳人  閱讀(35)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产成人影院一区二区三区| 久久久精品94久久精品| 亚洲精品日韩精品久久| 精品人妻久久久久久888| 欧洲亚洲成av人片天堂网| 久久久精品94久久精品| 国产初高中生粉嫩无套第一次| 国产精品视频一区二区噜噜| 资源新版在线天堂偷自拍| 亚洲欧洲日韩精品在线| 国偷自产一区二区三区在线视频| 亚洲色在线v中文字幕| 国产人免费人成免费视频| 91精品乱码一区二区三区| 国产精品亚洲二区亚瑟| 国产suv精品一区二区33| 亚洲一品道一区二区三区| 亚洲AV成人一区国产精品| 久久精品不卡一区二区| 黄色亚洲一区二区在线观看| 国内精品久久久久影视| 午夜福利影院不卡影院| 国产不卡一区二区在线视频| 亚洲欧美日韩综合久久| 人妻少妇精品无码专区二区| 亚洲综合不卡一区二区三区| 377P欧洲日本亚洲大胆| 国产一区二区三区av在线无码观看| 亚洲综合天堂av网站在线观看| 和艳妇在厨房好爽在线观看| 秋霞人妻无码中文字幕| 亚洲国产成人久久综合区| AV老司机AV天堂| 国产成人一区二区三区视频免费| 国产乱妇无码大片在线观看| 精品人妻中文字幕有码在线| 亚洲国产高清精品线久久| 国产欧美日韩亚洲一区二区三区| 成人午夜免费一区二区三区| 亚洲午夜无码av毛片久久| 天天影视色香欲综合久久|