范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Qt开发Qt中的事件处理(上)

  一、图形界面应用程序的消息处理模型
  二、Qt的事件处理
  1、Qt平台 将系统产生的消息转换为Qt事件 (每一个系统消息对象Qt平台的一个事件)
  (1)、Qt事件 是一个 QEvent的对象
  (2)、Qt事件用于描述程序 内部或者外部发生的动作
  (3)、 任意的QObject对象 都具备事件处理的能力
  2、GUI应用程序的事件处理方式
  (1)、Qt事件产生后 立即被分发到QWidget对象
  (2)、QWidget中的 event(QEvent*)进行事件处理
  (3)、event() 根据事件类型 调用不同的事件处理函数
  (4)、在 事件处理函数中 发送Qt中预定义的信号
  (5)、 调用信号关联的槽函数
  3、情景分析:按钮点击
  (1)、接收到鼠标事件( 代表一个系统消息 )
  (2)、调用event(QEvent*)成员函数
  (3)、调用 MouseReleaseEvent(QMouseEvent*) 成员函数
  (4)、调用 clicked() 成员函数
  (5)、 触发信号SIGNAL(clicked())
  4、事件(QEvent)和信号(SIGNAL)不同
  (1)、事件由具体对象 进行处理
  (2)、信号由具体对象 主动产生
  (3)、改写事件处理函数 可能导致程序行为 发生改变
  (4)、信号是否存在对应的槽函数 不会改变程序的行为
  (5)、 一般而言,信号在具体的事件处理函数中产生 三、文本编辑器的关闭操作
  void MainWindow::closeEvent(QCloseEvent *e)//没有对应的信号来处理,只能重写事件处理函数 {     preEditorChanged();      if(!m_isTextChanged)     {         QMainWindow::closeEvent(e);//调用父类的关闭事件处理函数     }     else     {         e->ignore();//点取消的话就忽略这个对话框     } }
  完整代码: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  class MainWindow : public QMainWindow {     Q_OBJECT private:         QPlainTextEdit mainEdit;         QLabel statusLabel;         QString m_filePath;//记得在构造函数里初始化         bool m_isTextChanged;//构造函数里初始化为false          MainWindow(QWidget *parent = 0);         MainWindow(const MainWindow& obj);         MainWindow* operator = (const MainWindow& obj);         bool construct();          bool initMenuBar();//菜单栏         bool initToolBar();//工具栏         bool initStatusBar();//状态栏         bool initinitMainEditor();//编辑窗口          bool initFileMenu(QMenuBar* mb);//文件菜单         bool initEditMenu(QMenuBar* mb);//编辑菜单         bool initFormatMenu(QMenuBar* mb);//格式菜单         bool initViewMenu(QMenuBar* mb);//视图菜单         bool initHelpMenu(QMenuBar* mb);//帮助菜单          bool initFileToolItem(QToolBar* tb);//工具选项         bool initEditToolItem(QToolBar* tb);         bool initFormatToolItem(QToolBar* tb);         bool initViewToolItem(QToolBar* tb);           bool makeAction(QAction*& action,QMenu* menu, QString text, int key);//菜单项         bool makeAction(QAction*& action,QToolBar* tb, QString tip, QString icon);          QString showFileDialog(QFileDialog::AcceptMode mode, QString title);//文件对话框         void showErrorMessage(QString message);//错误消息对话框         int showQuesstionMessage(QString message);//问题消息对话框         QString saveCurrentData(QString path = "");         void preEditorChanged();  private slots:         void onFileNew();         void onFileOpen();         void onFlieSave();         void onFileSaveAs();         void onTextChanged(); protected:         void closeEvent(QCloseEvent *e);//重写关闭窗口的事件处理函数 public:      static MainWindow* NewInstance();     ~MainWindow(); };  #endif // MAINWINDOW_H#include "MainWindow.h" #include   MainWindow::MainWindow(QWidget *parent)     : QMainWindow(parent), statusLabel(this) {     m_filePath = "";     m_isTextChanged = false;     setWindowTitle("NotePad-[New]"); }  bool MainWindow::construct() {     bool ret = true;     ret = ret && initMenuBar();     ret = ret && initToolBar();     ret = ret && initStatusBar();     ret = ret && initinitMainEditor();     return ret; } MainWindow* MainWindow::NewInstance() {     MainWindow* ret = new MainWindow();      if((ret==NULL) || (!ret->construct()))     {         delete ret;         ret = NULL;     }      return ret; } bool MainWindow::initMenuBar()//菜单栏 {     bool ret = true;      QMenuBar* mb = menuBar();//一定要注意是menuBar(),这是普通成员函数,不是构造函数      ret = ret && initFileMenu(mb);//传一个参数是为了在initFileMenu()函数将menu加入菜单栏     ret = ret && initEditMenu(mb);     ret = ret && initFormatMenu(mb);     ret = ret && initViewMenu(mb);     ret = ret && initHelpMenu(mb);      return ret;  }  bool MainWindow::initToolBar()//工具栏 {     bool ret = true;      QToolBar* tb = addToolBar("Tool Bar");     //tb->setMovable(false);     //tb->setFloatable(false);     tb->setIconSize(QSize(16,16));      ret = ret && initFileToolItem(tb);     tb->addSeparator();     ret = ret && initEditToolItem(tb);     tb->addSeparator();     ret = ret && initFormatToolItem(tb);     tb->addSeparator();     ret = ret && initViewToolItem(tb);      return ret; }  bool MainWindow::initStatusBar()//状态栏 {     bool ret = true;      QStatusBar* sb = statusBar();      QLabel* label = new QLabel("Made By LGC");      if(label != NULL)     {         statusLabel.setMinimumWidth(200);         statusLabel.setAlignment(Qt::AlignHCenter);         statusLabel.setText("Ln:1    Col:1");           label->setMinimumWidth(200);         label->setAlignment(Qt::AlignHCenter);          sb->addPermanentWidget(new QLabel());//单纯加入分隔符         sb->addPermanentWidget(&statusLabel);         sb->addPermanentWidget(label);     }     else     {         ret = false;     }     return ret; } bool MainWindow::initinitMainEditor()//编辑窗口 {     bool ret = true;      mainEdit.setParent(this);     setCentralWidget(&mainEdit);      connect(&mainEdit, SIGNAL(textChanged()), this, SLOT(onTextChanged()));      return ret; }  /************************************************文件菜单********************************************************/ bool MainWindow::initFileMenu(QMenuBar* mb) {     bool ret = true;      QMenu* menu = new QMenu("File(&F)");//创建文件菜单,(&F)是为了可以Alt+F打开     ret = (menu != NULL);     if(ret)     {         QAction* action = NULL;          //New         ret = ret &&  makeAction(action, menu, "New(&N)",Qt::CTRL + Qt::Key_N);         if(ret)         {            connect(action, SIGNAL(triggered()), this, SLOT(onFileNew()));            menu->addAction(action);         }          menu->addSeparator();          //Open         ret = ret &&  makeAction(action,  menu,"Open(&O)...",Qt::CTRL + Qt::Key_O);         if(ret)         {            connect(action, SIGNAL(triggered()), this, SLOT(onFileOpen()));            menu->addAction(action);         }          menu->addSeparator();          //Save         ret = ret &&  makeAction(action,  menu,"Save(&S)",Qt::CTRL + Qt::Key_S);         if(ret)         {             connect(action, SIGNAL(triggered()), this ,SLOT(onFlieSave()));             menu->addAction(action);         }          menu->addSeparator();          //Save As         ret = ret &&  makeAction(action, menu, "Save As(&A)...",0);         if(ret)         {            connect(action, SIGNAL(triggered()), this, SLOT(onFileSaveAs()));            menu->addAction(action);          }          menu->addSeparator();          //print         ret = ret &&  makeAction(action, menu, "Print(&P)...",Qt::CTRL + Qt::Key_P);         if(ret)         {            menu->addAction(action);         }          menu->addSeparator();          //Exit         ret = ret &&  makeAction(action,  menu,"Exit(&X)",0);         if(ret)         {            menu->addAction(action);//将菜单项加入到菜单         }      }     if(ret)     {         mb->addMenu(menu);//将菜单加入到菜单栏     }     else     {         delete mb;     }     return ret; }  /************************************************编辑菜单********************************************************/ bool MainWindow::initEditMenu(QMenuBar* mb) {     bool ret = true;      QMenu* menu = new QMenu("Edit(&E)");     ret = (menu != NULL);     if(ret)     {         QAction* action = NULL;          //Undo         ret = ret &&  makeAction(action,  menu,"Undo(&U)",Qt::CTRL + Qt::Key_Z);         if(ret)         {            menu->addAction(action);         }          menu->addSeparator();          //Redo         ret = ret &&  makeAction(action,  menu,"Redo(&R)...",Qt::CTRL + Qt::Key_Y);         if(ret)         {            menu->addAction(action);         }          menu->addSeparator();          //Cut         ret = ret &&  makeAction(action,  menu,"Cut(&T)",Qt::CTRL + Qt::Key_X);         if(ret)         {            menu->addAction(action);         }          menu->addSeparator();          //Copy         ret = ret &&  makeAction(action,  menu,"Copy(&C)...",Qt::CTRL + Qt::Key_C);         if(ret)         {            menu->addAction(action);         }          menu->addSeparator();          //Pase         ret = ret &&  makeAction(action,  menu,"Pase(&P)...",Qt::CTRL + Qt::Key_V);         if(ret)         {            menu->addAction(action);         }          menu->addSeparator();          //Delete         ret = ret &&  makeAction(action, menu, "Delete(&L)",Qt::Key_Delete);         if(ret)         {            menu->addAction(action);         }          menu->addSeparator();          //Find         ret = ret &&  makeAction(action,  menu,"Find(&F)...",Qt::CTRL + Qt::Key_F);         if(ret)         {            menu->addAction(action);         }          menu->addSeparator();          //Replace         ret = ret &&  makeAction(action,  menu,"Replace(&R)...",Qt::CTRL + Qt::Key_H);         if(ret)         {            menu->addAction(action);         }          menu->addSeparator();          //Goto         ret = ret &&  makeAction(action,  menu,"Goto(&G)",Qt::CTRL + Qt::Key_G);         if(ret)         {            menu->addAction(action);         }          menu->addSeparator();          //Select All         ret = ret &&  makeAction(action, menu, "Select All(&A)",Qt::CTRL + Qt::Key_A);         if(ret)         {            menu->addAction(action);         }      }     if(ret)     {         mb->addMenu(menu);     }     else     {         delete mb;     }     return ret; }  /************************************************格式菜单********************************************************/ bool MainWindow::initFormatMenu(QMenuBar* mb) {     bool ret = true;      QMenu* menu = new QMenu("Format(&O)");     ret = (menu != NULL);     if(ret)     {         QAction* action = NULL;          //Auto Wrap         ret = ret &&  makeAction(action,  menu,"Auto Wrap(&W)",0);         if(ret)         {            menu->addAction(action);         }          menu->addSeparator();          //Font         ret = ret &&  makeAction(action,  menu,"Font(&F)...",0);         if(ret)         {            menu->addAction(action);         }      }     if(ret)     {         mb->addMenu(menu);     }     else     {         delete mb;     }     return ret; }  /************************************************视图菜单********************************************************/ bool MainWindow::initViewMenu(QMenuBar* mb) {     bool ret = true;      QMenu* menu = new QMenu("View(&V)");     ret = (menu != NULL);     if(ret)     {         QAction* action = NULL;          //Tool Bar         ret = ret &&  makeAction(action, menu,"Tool Bar(&T)",0);         if(ret)         {            menu->addAction(action);         }          menu->addSeparator();          //Status Bar         ret = ret &&  makeAction(action, menu,"Status Bar(&S)",0);         if(ret)         {            menu->addAction(action);         }      }     if(ret)     {         mb->addMenu(menu);     }     else     {         delete mb;     }     return ret; }  /************************************************帮助菜单********************************************************/ bool MainWindow::initHelpMenu(QMenuBar* mb) {     bool ret = true;      QMenu* menu = new QMenu("Help(&H)");     ret = (menu != NULL);     if(ret)     {         QAction* action = NULL;          //User Manual         ret = ret &&  makeAction(action,  menu,"User Manual",0);         if(ret)         {            menu->addAction(action);         }          menu->addSeparator();          //About NotePad         ret = ret &&  makeAction(action,  menu,"About NotePad...",0);         if(ret)         {            menu->addAction(action);         }      }     if(ret)     {         mb->addMenu(menu);     }     else     {         delete mb;     }     return ret; } /*****************************************工具************************************************************/ bool MainWindow::initFileToolItem(QToolBar* tb) {     bool ret = true;     QAction* action = NULL;      ret = ret && makeAction(action, tb, "New", ":/Res/pic/new.png");     if(ret)     {         connect(action, SIGNAL(triggered()), this, SLOT(onFileNew()));         tb->addAction(action);      }      ret = ret && makeAction(action,  tb,"Open", ":/Res/pic/open.png");     if(ret)     {         connect(action, SIGNAL(triggered()), this, SLOT(onFileOpen()));         tb->addAction(action);     }      ret = ret && makeAction(action,  tb,"Save", ":/Res/pic/save.png");     if(ret)     {         connect(action, SIGNAL(triggered()), this ,SLOT(onFlieSave()));         tb->addAction(action);     }      ret = ret && makeAction(action,  tb,"Save As", ":/Res/pic/saveas.png");     if(ret)     {         connect(action, SIGNAL(triggered()), this, SLOT(onFileSaveAs()));         tb->addAction(action);     }     ret = ret && makeAction(action, tb,"Print",  ":/Res/pic/print.png");     if(ret)     {         tb->addAction(action);     }     return ret;  } bool MainWindow::initEditToolItem(QToolBar* tb) {     bool ret = true;     QAction* action = NULL;      ret = ret && makeAction(action, tb,"Undo",  ":/Res/pic/undo.png");     if(ret)     {         tb->addAction(action);     }     ret = ret && makeAction(action,  tb,"Redo", ":/Res/pic/redo.png");     if(ret)     {         tb->addAction(action);     }      ret = ret && makeAction(action, tb, "Cut",  ":/Res/pic/cut.png");     if(ret)     {         tb->addAction(action);     }      ret = ret && makeAction(action,  tb,"Copy", ":/Res/pic/copy.png");     if(ret)     {         tb->addAction(action);     }      ret = ret && makeAction(action, tb,"Paste",  ":/Res/pic/paste.png");     if(ret)     {         tb->addAction(action);     }      ret = ret && makeAction(action, tb,"Find",  ":/Res/pic/find.png");     if(ret)     {         tb->addAction(action);     }     ret = ret && makeAction(action, tb,"Replace",  ":/Res/pic/replace.png");     if(ret)     {         tb->addAction(action);     }     ret = ret && makeAction(action, tb,"Goto",  ":/Res/pic/goto.png");     if(ret)     {         tb->addAction(action);     }      return ret; } bool MainWindow::initFormatToolItem(QToolBar* tb) {     bool ret = true;     QAction* action = NULL;      ret = ret && makeAction(action, tb, "Auto Wrap", ":/Res/pic/wrap.png");     if(ret)     {         tb->addAction(action);     }     ret = ret && makeAction(action, tb,"Font",  ":/Res/pic/font.png");     if(ret)     {         tb->addAction(action);     }      return ret; } bool MainWindow::initViewToolItem(QToolBar* tb) {     bool ret = true;     QAction* action = NULL;      ret = ret && makeAction(action,  tb,"Tool Bar", ":/Res/pic/tool.png");     if(ret)     {         tb->addAction(action);     }     ret = ret && makeAction(action,  tb,"Status Bar", ":/Res/pic/status.png");     if(ret)     {         tb->addAction(action);     }      return ret; }   bool MainWindow::makeAction(QAction*& action,QMenu* menu, QString text, int key)//菜单项 {     bool ret = true;     action = new QAction(text, menu);     if(action != NULL)     {         action->setShortcut(QKeySequence(key));//创建快捷键     }     else     {         ret = false;     }      return ret; } bool MainWindow::makeAction(QAction*& action,QToolBar* tb, QString tip, QString icon) {     bool ret = true;     action = new QAction("", tb);     if(action != NULL)     {         action->setToolTip(tip);         action->setIcon(QIcon(icon));     }     else     {         ret = false;     }     return ret; } MainWindow::~MainWindow() {  }#include  #include  #include  #include  #include  #include "MainWindow.h" #include   QString MainWindow::showFileDialog(QFileDialog::AcceptMode mode, QString title) {     QString ret = "";     QFileDialog fd;     QStringList filters;     QMap map;      const char* fileArray[][2]=     {          {"Text(*.txt)",    ".txt"},         {"All Files(*.*)",   "*" },         {NULL,               NULL}      };      for(int i=0; fileArray[i][0] != NULL; i++)     {         filters.append(fileArray[i][0]);         map.insert(fileArray[i][0], fileArray[i][1]);     }      fd.setWindowTitle(title);     fd.setAcceptMode(mode);       fd.setNameFilters(filters);      if(mode==QFileDialog::AcceptOpen)     {         fd.setFileMode(QFileDialog::ExistingFile);     }      if(fd.exec()==QFileDialog::Accepted)     {         ret = fd.selectedFiles()[0];          QString posix = map[fd.selectedNameFilter()];//把下拉中选中的后缀对应键值取出          if(posix != "*" && !ret.endsWith(posix))         {             ret += posix;         }     }      return ret; }  void MainWindow::showErrorMessage(QString message) {     QMessageBox mb(this);      mb.setWindowTitle("Quession");     mb.setText(message);     mb.setIcon(QMessageBox::Critical);     mb.setStandardButtons(QMessageBox::Ok);      mb.exec(); }  int MainWindow::showQuesstionMessage(QString message) {     QMessageBox mb(this);      mb.setWindowTitle("Error");     mb.setText(message);     mb.setIcon(QMessageBox::Question);     mb.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);      return  mb.exec(); }  QString MainWindow::saveCurrentData(QString path) {     QString ret = path;     if(ret == "")     {         ret = showFileDialog(QFileDialog::AcceptSave, "Save");      }      if(ret != "")     {         QFile file(ret);         if(file.open(QIODevice::WriteOnly | QIODevice::Text))         {             QTextStream out(&file);              out << QString(mainEdit.toPlainText());              file.close();              setWindowTitle("NotePad - [" + ret + "]");              m_isTextChanged = false;//保存后修改状态值         }         else         {             showErrorMessage(QString("Open file Error!  ") + """ + m_filePath + """);             ret = "";         }     }      return ret;  } void MainWindow::preEditorChanged() {     if(m_isTextChanged)     {         int r = showQuesstionMessage("Do you want to Save?");         switch (r)         {         case QMessageBox::Yes:             saveCurrentData(m_filePath);             break;         case QMessageBox::No:             m_isTextChanged = false;             break;         case QMessageBox::Cancel:             break;         }      } } void MainWindow::onFileNew() {     preEditorChanged();     if(!m_isTextChanged)     {         mainEdit.clear();          m_filePath = "";          m_isTextChanged = false;          setWindowTitle("NotePad-[New]");     } } void MainWindow::onFileOpen() {      preEditorChanged();      if(!m_isTextChanged)     {         QString path = showFileDialog(QFileDialog::AcceptOpen, "open");          if(path != "")         {             QFile file(path);             if(file.open(QIODevice::ReadOnly | QIODevice::Text))             {                 mainEdit.setPlainText(QString(file.readAll()));                  file.close();                  m_filePath = path;//报存当前文件路径                  setWindowTitle("NotePad - [" + m_filePath + "]");             }             else             {                 showErrorMessage(QString("Open file Error!  ") + """ + m_filePath + """);             }         }     }  }  void MainWindow::onFlieSave() {     QString path = saveCurrentData(m_filePath);      if(path != "")     {         m_filePath = path;     } }  void MainWindow::onFileSaveAs() {     QString path = saveCurrentData();//使用默认参数      if(path != "")     {         m_filePath = path;     }  } void MainWindow::onTextChanged() {     if(!m_isTextChanged)     {         setWindowTitle("*" + windowTitle());     }     m_isTextChanged = true;  }  void MainWindow::closeEvent(QCloseEvent *e)//没有对应的信号来处理,只能重写事件处理函数 {     preEditorChanged();      if(!m_isTextChanged)     {         QMainWindow::closeEvent(e);//调用父类的关闭事件处理函数     }     else     {         e->ignore();//点取消的话就忽略这个对话框     } }#include  #include "MainWindow.h" #include    int main(int argc, char *argv[]) {     QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); //路径名支持中文     QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK")); //QString支持中文     QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK")); //string支持中文     QApplication a(argc, argv);     MainWindow* w = MainWindow::NewInstance();     int ret = -1;     if(w != NULL)     {         w->show();         ret = a.exec();     }      delete w;     return ret; }四、小结
  (1)、事件(QEvent)和信号(SIGNAL) 不同
  (2)、事件由 QObject对象 进行处理
  (3)、 信号由QObject对象触发
  (4)、 重写事件处理函数 可能改变程序行为
  (5)、信号的触发 不会 对程序行为造成影响
  (6)、 事件处理是在实际工程开发中的应用非常普遍
  【领QT开发教程 学习资料,点击下方链接莬费领取↓↓ ,先码住不迷路~】
  「链接」

经常吃豆腐乳的人,最后身体有了什么变化?建议了解豆腐乳,是中国流传数千年的特色传统民间美食,因其口感好,营养高,闻起来有股臭味,吃起来特别的香味,深受中国老百姓及东南亚地区人民的喜爱,是一道经久不衰的美味佳肴。豆腐乳通常分为青方想要长寿,做好营养均衡工作很重要,坚持打卡沾化冬枣想要长寿,做好营养均衡工作很重要,坚持打卡沾化冬枣长寿几乎是每一个人的心理期待,成为百岁老人也是梦想。其实,要想长寿,一个基本的条件是我们的身体要保持营养均衡的状态。如果缺少某种营丁俊晖状态神勇,三杆过百,40轻取伯恩斯,晋级英格兰赛正赛2022年斯诺克英格兰公开赛资格赛于北京时间10月27日进入到第三个比赛日的较量。在刚刚结束的一场备受中国广大球迷关注的比赛中,我国名将丁俊晖状态极佳,发挥出色,轰出三杆过百,以4如果你放不下一个人,不妨做好三件事情文叶衣衣一支笔,写尽温暖的人间烟火。愿得一人心,白首不相离每个人都追求一世一双人,然而并不是每一段感情都能开花结果。在爱情中我们也会面临着各种各样的问题,可能有时候我们会面临着分手让人相见恨晚的人生哲理一没有结局的故事太多,你要习惯相遇与离别。岁月会记得,你温柔赤诚的心。二有人帮你,是你的幸运,无人帮你,是公正的命运。没有人该为你做什么,因为生命是你自己的,你得为自己负责。三社会让你长寿20年的习惯,中老年人需要了解如何长寿,一直是人类不可回避的话题。痴迷于长寿的秦始皇曾不惜人力物力炼制多种长寿丹丸,结果适得其反,不到50岁就结束了自己的生命。所以有时候并不是单单吃什么,还有一些我们认为不好的大厂集体裁员,程序员面临失业,走之前能再为企业做点什么?2月17日,字节跳动宣布裁员,涉及的公司包括字节跳动上海北京深圳杭州成都广州等地。消息一出,立刻在IT圈炸开了锅。不知道为什么,我的绩效还行,工资也没有降。这次裁员有点意外吧,让我今晚双11付尾款!商品价格天天变?鞋子竟然要三只一起买?各种迷惑操作一堆小伙伴们注意今晚8点天猫双十一要开始付尾款了!!网友漫画太形象了!你是今晚的尾款人嘛?算算今年你有多少尾款要付?买了和没买的网友完全是两种画风看来人类的悲欢并不相通也有网友吐槽现在从苹果13换到一加AcePro,部分治愈了我的焦虑最近换了个手机,把主力机从苹果13换到了一加AcePro,部分治愈了我的焦虑。说是部分治愈,是因为两个手机各有各的好,就便利度而言一加AcePro更优。其实我也算是半个果粉了,断断iPhone14所向披靡!苹果霸占中国手机市场第一国产没一个能打的在9月份苹果发布了新款iPhone14系列,一下子就引爆了沉寂已久的手机圈。热度之高除了昔日大哥华为还敢发新机Mate50系列对抗一下外,其它所有国产手机厂商压根就没了声音。不过当2022双11买苹果手机,iphone13和iphone14怎么选?看这几点就够了各大手机厂商为了销量经常会进行促销降价来吸引消费者,不同手机品牌降价力度也不一样,所以销售情况也不尽相同,不过每年电商节苹果和小米这两个品牌不管是线上还是线下都卖的很不错,例如双1
香港恢复通关,奉上2023年必打卡旅游攻略鹿椰青1月8日香港通关,阔别了三年的港式奶茶菠萝油终于回来了!香港美味无处不在,不只是名声在外的兰芳园华嫂冰室,小至街头大排档,大到高级米其林餐厅,都是吃货们最惦记的味道。小佳啵唧江之岛2天1夜行程推荐!绝美海景私房景点海景餐厅大公开湘南海岸江之岛所在的神奈川县藤泽市从东京出发仅约1小时,是想要放松休闲享受阳光与海水的好地点!这篇文章以江之岛为主,介绍当地私房景点必吃美食以及海上活动体验,还要介绍江之岛灯笼等夜春节遇见楚雄丨黑井古镇烟火依旧!值得你来打卡来源云南日报黑井古镇位于禄丰市西北部,地处曲径高山险,山峦欲接天,万山相与峙,一水送烟溪的龙川江两侧,曾因盐而兴,因盐而盛,素有明清盐文化博物馆和明清社会活化石之称。古镇里,紫色砂非洲留学生中国古镇迎新春1月11日,在安徽省合肥市肥西县三河古镇,非洲留学生体验地方民俗表演闹花船。1月11日,来自安徽省合肥市多所高校的约40名非洲留学生代表,来到合肥市肥西县三河古镇,通过游览古镇风光瑞雪红梅欢喜过年游购乡村系列活动启动仪式在京举办央广网北京1月13日消息(记者黄玉玲)1月13日,瑞雪红梅欢喜过年游购乡村系列活动启动仪式在中国工艺美术馆举办,由文化和旅游部资源开发司商务部流通发展司国家乡村振兴局社会帮扶司全国踏上BC省的冬日旅途,邂逅抚慰身心的疗愈秘境冬意愈浓,万物归藏,轻柔的雪花将BC省的美好敛于了一片宁静的纯白天地间。此时此刻,想为忙碌的生活按下暂停键,寻找内心久违的平静与舒缓,BC省将会是你最好的疗愈秘境。这里坐拥广袤纯净唱响冬日恋歌畅享冰雪激情湖州向您发来一份冬日旅行邀请作为北京冬奥会后的首个大众冰雪季,群众对于冰雪旅游的热情在这个冬季持续释放,冰雪旅游成为当下时尚新玩法。在浙江湖州周边分布着云上草原滑雪场观音堂滑雪场江南天池滑雪场等多个畅玩冰雪的广州市流溪河十万余株梅花竞相绽放不少摄影爱好者到广州流溪河公园拍摄梅花何毅毅摄中新网广州1月13日电(程景伟何毅毅)北国雪飘,南国梅开。目前,广州市流溪河国家森林公园自然保护地内的十万余株梅花竞相绽放,吸引众多游三体电视剧定档本周末!EVA新剧场版终1月20日国内上线临近2023年春节,影视剧迷似乎一下子就有福起来了,阿凡达2这才上线不久(虽然评价不是太高),此前备受期待的EVA最终章EVA新剧场版终确认将于1月20日上线国内视频平台!这还不算洗碗机消毒柜市场2022年整体发展趋势及展望洗碗机消毒柜两者同为改善性需求,既是替代关系,又是共存关系。在家电市场整体低迷的背景下,洗碗机作为新兴品类仍旧保持增长,是厨电产业增长最好的品类。据奥维云网(AVC)推总数据显示,中国四大牧区,都说自家的羊肉最好吃!爱吃羊肉的朋友一定知道,相比于南方养殖的羊肉,北方草原上的羊肉膻味更小,鲜香肥美。其中比较出名的例如宁夏滩羊,内蒙古苏尼特羊等等。那是因为北方有着广袤的牧场,散养的羊儿们吃着中草药