Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。
本文将展示如何使用信号和槽来实现计算器小部件的功能,以及如何使用QGridLayout在网格中放置子小部件。
点击获取Qt Widget组件下载(Q技术交流:166830288)
计算器示例的屏幕截图
这个例子由两个类组成:
我们将从回顾计算器开始,然后再看看按钮。
- class Calculator : public QWidget
- {
- Q_OBJECT
-
- public:
- Calculator(QWidget *parent = nullptr);
-
- private slots:
- void digitClicked();
- void unaryOperatorClicked();
- void additiveOperatorClicked();
- void multiplicativeOperatorClicked();
- void equalClicked();
- void pointClicked();
- void changeSignClicked();
- void backspaceClicked();
- void clear();
- void clearAll();
- void clearMemory();
- void readMemory();
- void setMemory();
- void addToMemory();
Calculator类提供了一个简单的计算器小部件,它继承自QDialog,并且有几个与计算器按钮相关联的私有槽,重新实现了QObject::eventFilter()来处理计算器显示的鼠标事件。
Buttons根据其操作进行分类。例如,所有数字按钮(标记为0到9)向当前操作数追加一个数字。对于这些,我们将多个按钮连接到同一个插槽(例如,digitClicked())。类别包括数字、一元运算符(Sqrt、x²、1/x)、加法运算符(+、-)和乘法运算符(x、÷),其他按钮都有自己的插槽。
- private:
- template<typename PointerToMemberFunction>
- Button *createButton(const QString &text, const PointerToMemberFunction &member);
- void abortOperation();
- bool calculate(double rightOperand, const QString &pendingOperator);
私有的createButton()函数被用作小部件构造的一部分,abortOperation()在发生除零操作或对负数进行平方根操作时调用,Calculate()应用二进制运算符(+、-、x或÷)。
- double sumInMemory;
- double sumSoFar;
- double factorSoFar;
- QString pendingAdditiveOperator;
- QString pendingMultiplicativeOperator;
- bool waitingForOperand;
这些变量与计算器显示的内容(QLineEdit)一起编码计算器的状态:
加法运算符和乘法运算符的处理方式不同,因为它们具有不同的优先级。例如,1 + 2 ÷ 3被解释为1 + (2 ÷ 3),因为÷的优先级高于+。
下表显示了当用户输入数学表达式时计算器状态的演变。
一元操作符,如Sqrt,不需要特殊处理;它们可以立即应用,因为在单击操作符按钮时已经知道操作数。
- QLineEdit *display;
-
- enum { NumDigitButtons = 10 };
- Button *digitButtons[NumDigitButtons];
- };
最后,声明与显示和用于显示数字的按钮相关联的变量。