当前位置:   article > 正文

嵌入式Qt Qt中的信号处理

嵌入式Qt Qt中的信号处理

一.Qt中的信号处理

Qt消息模型:

- Qt封装了具体操作系统的消息机制

- Qt遵循经典的GUI消息驱动事件模型

Qt中定义了与系统消息相关的概念;

 

Qt中的消息处理机制:

Qt的核心 QObject::cinnect函数:

Qt中的“新”关键字:

实验1 初探信号与槽 

  1. #include <QtGui/QApplication>
  2. #include <QPushButton>
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv);//应用程序对象
  6. QPushButton b;//按钮对象
  7. b.setText("Click me to quit!");
  8. b.show();
  9. //通过connect函数 将按钮对象的点击事件信号 映射到 a对象的quit()成员函数
  10. QObject::connect(&b, SIGNAL(clicked()), &a, SLOT(quit()));
  11. return a.exec();
  12. }

 运行结果:

二.自定义槽

- 只有QObject的子类才能自定义槽

- 定义槽的类必须在声明的最开始处使用Q_OBJECT

- 类中的声明槽时需要使用slots关键字

- 槽与所处理的信号在函数签名上必须一致

- SIGNAL和SLOT所指定的名称中:可以包含参数类型,不能包含具体的参数名

实验2 为计算器界面添加消息处理函数,所有按钮对应一个槽,打印同样log

目录:

QCalculatorUI.h:

  1. #ifndef _QCALCULATORUI_H_
  2. #define _QCALCULATORUI_H_
  3. #include <QWidget>
  4. #include <QLineEdit>
  5. #include <QPushButton>
  6. class QCalculatorUI : public QWidget
  7. {
  8. Q_OBJECT
  9. private:
  10. QLineEdit* m_edit;
  11. QPushButton* m_buttons[20];
  12. QCalculatorUI();
  13. bool construct();
  14. private slots:
  15. void onButtonClicked();
  16. public:
  17. static QCalculatorUI* NewInstance();
  18. void show();
  19. ~QCalculatorUI();
  20. };
  21. #endif

QCalculatorUI.cpp:

  1. #include "QCalculatorUI.h"
  2. #include <QDebug>
  3. QCalculatorUI::QCalculatorUI() : QWidget(NULL, Qt::WindowCloseButtonHint)
  4. {
  5. }
  6. bool QCalculatorUI::construct()
  7. {
  8. bool ret = true;
  9. const char* btnText[20] =
  10. {
  11. "7", "8", "9", "+", "(",
  12. "4", "5", "6", "-", ")",
  13. "1", "2", "3", "*", "<-",
  14. "0", ".", "=", "/", "C",
  15. };
  16. m_edit = new QLineEdit(this);
  17. if( m_edit != NULL )
  18. {
  19. m_edit->move(10, 10);
  20. m_edit->resize(240, 30);
  21. m_edit->setReadOnly(true);
  22. }
  23. else
  24. {
  25. ret = false;
  26. }
  27. for(int i=0; (i<4) && ret; i++)
  28. {
  29. for(int j=0; (j<5) && ret; j++)
  30. {
  31. m_buttons[i*5 + j] = new QPushButton(this);
  32. if( m_buttons[i*5 + j] != NULL )
  33. {
  34. m_buttons[i*5 + j]->resize(40, 40);
  35. m_buttons[i*5 + j]->move(10 + (10 + 40)*j, 50 + (10 + 40)*i);
  36. m_buttons[i*5 + j]->setText(btnText[i*5 + j]);
  37. connect(m_buttons[i*5 + j], SIGNAL(clicked()), this, SLOT(onButtonClicked()));
  38. }
  39. else
  40. {
  41. ret = false;
  42. }
  43. }
  44. }
  45. return ret;
  46. }
  47. QCalculatorUI* QCalculatorUI::NewInstance()
  48. {
  49. QCalculatorUI* ret = new QCalculatorUI();
  50. if( (ret == NULL) || !ret->construct() )
  51. {
  52. delete ret;
  53. ret = NULL;
  54. }
  55. return ret;
  56. }
  57. void QCalculatorUI::show()
  58. {
  59. QWidget::show();
  60. setFixedSize(width(), height());
  61. }
  62. void QCalculatorUI::onButtonClicked()
  63. {
  64. QPushButton* btn = (QPushButton*)sender();
  65. qDebug() << "onButtonClicked()";
  66. qDebug() << btn->text();
  67. }
  68. QCalculatorUI::~QCalculatorUI()
  69. {
  70. }

main.cpp:

  1. #include <QApplication>
  2. #include "QCalculatorUI.h"
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv);
  6. QCalculatorUI* cal = QCalculatorUI::NewInstance();
  7. int ret = -1;
  8. if( cal != NULL )
  9. {
  10. cal->show();
  11. ret = a.exec();
  12. delete cal;
  13. }
  14. return ret;
  15. }

运行结果:点击 ”7“  ”8“  ”9“

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/101255
推荐阅读
相关标签
  

闽ICP备14008679号