The most requested next C++ app you guys asked for was a calculator, so here it is. We’ll make a C++ GUI Calculator app in one video. Along the way we’ll learn a lot! We’ll cover a topic which confuses many people which is how to setup event handling with Signals and Slots. We’ll also cover how to work with widgets in many ways, setting up an interface, stylesheets, casting, regular expressions and much more.
All of the heavily commented code follows the video below.
If you like videos like this, consider donating $1, or simply turn off Ad Blocking software. Doing either allows me to keep making free videos for the world.
Code from the Video
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 |
DESIGN Drop QLineEdit in window -> Name it Display -> Preferred & Expanding Right Click Window -> Layout -> Layout in Grid Create QPushButtons 5 wide and 4 deep -> Preferred & Preferred 7 8 9 / M+ 4 5 6 * M- 1 2 3 + M AC 0 +/- - = Name them Button0 - Button9, Add, Subtract, Multiply, Divide, Equals, ChangeSign, Clear, MemAdd, MemClear, MemGet Line Edit Stylesheet QLineEdit { background-color: gray; border: 1px solid gray; color: #ffffff;} 10. PushButton Stylesheet QPushButton { background-color: #C0C0C0; border: 1px solid gray; border-radius: 0px; padding: 5px; } QPushButton:pressed { background-color: #A9A9A9; border: 1px solid gray; border-radius: 0px; padding: 5px; } ————— CALC.H ————— #ifndef CALC_H #define CALC_H #include <QMainWindow> // Use the standard UI namespace which is tied to the .ui file namespace Ui { class Calc; } class Calc : public QMainWindow { // Declares our class as a QObject which is the base class // for all Qt objects // QObjects handle events Q_OBJECT public: // Declare a constructor and by passing 0 we state this widget // has no parent explicit Calc(QWidget *parent = 0); ~Calc(); private: Ui::Calc *ui; // These slots are executed when a signal is // submitted (Ex. Number button is clicked) private slots : void NumPressed(); void MathButtonPressed(); void EqualButtonPressed(); void ChangeNumberSign(); }; #endif // CALC_H ————— END CALC.H ————— ————— CALC.CPP ————— #include "calc.h" #include "ui_calc.h" // Holds current value of calculation double calcVal = 0.0; // Will define if this was the last math button clicked bool divTrigger = false; bool multTrigger = false; bool addTrigger = false; bool subTrigger = false; // Constructor Calc::Calc(QWidget *parent) : // Call the QMainWindow constructor QMainWindow(parent), // Create the UI class and assign it to the ui member ui(new Ui::Calc) { // Setup the UI ui->setupUi(this); // Put 0.0 in Display ui->Display->setText(QString::number(calcVal)); // Will hold references to all the number buttons QPushButton *numButtons[10]; // Cycle through locating the buttons for(int i = 0; i < 10; ++i){ QString butName = "Button" + QString::number(i); // Get the buttons by name and add to array numButtons[i] = Calc::findChild<QPushButton *>(butName); // When the button is released call num_pressed() connect(numButtons[i], SIGNAL(released()), this, SLOT(NumPressed())); } // Connect signals and slots for math buttons connect(ui->Add, SIGNAL(released()), this, SLOT(MathButtonPressed())); connect(ui->Subtract, SIGNAL(released()), this, SLOT(MathButtonPressed())); connect(ui->Multiply, SIGNAL(released()), this, SLOT(MathButtonPressed())); connect(ui->Divide, SIGNAL(released()), this, SLOT(MathButtonPressed())); // Connect equals button connect(ui->Equals, SIGNAL(released()), this, SLOT(EqualButtonPressed())); // Connect change sign connect(ui->ChangeSign, SIGNAL(released()), this, SLOT(ChangeNumberSign())); } Calc::~Calc() { delete ui; } void Calc::NumPressed(){ // Sender returns a pointer to the button pressed QPushButton *button = (QPushButton *)sender(); // Get number on button QString butVal = button->text(); // Get the value in the display QString displayVal = ui->Display->text(); if((displayVal.toDouble() == 0) || (displayVal.toDouble() == 0.0)){ // calcVal = butVal.toDouble(); ui->Display->setText(butVal); } else { // Put the new number to the right of whats there QString newVal = displayVal + butVal; // Double version of number double dblNewVal = newVal.toDouble(); // calcVal = newVal.toDouble(); // Set value in display and allow up to 16 // digits before using exponents ui->Display->setText(QString::number(dblNewVal, 'g', 16)); } } void Calc::MathButtonPressed(){ // Cancel out previous math button clicks divTrigger = false; multTrigger = false; addTrigger = false; subTrigger = false; // Store current value in Display QString displayVal = ui->Display->text(); calcVal = displayVal.toDouble(); // Sender returns a pointer to the button pressed QPushButton *button = (QPushButton *)sender(); // Get math symbol on the button QString butVal = button->text(); if(QString::compare(butVal, "/", Qt::CaseInsensitive) == 0){ divTrigger = true; } else if(QString::compare(butVal, "*", Qt::CaseInsensitive) == 0){ multTrigger = true; } else if(QString::compare(butVal, "+", Qt::CaseInsensitive) == 0){ addTrigger = true; } else { subTrigger = true; } // Clear display ui->Display->setText(""); } void Calc::EqualButtonPressed(){ // Holds new calculation double solution = 0.0; // Get value in display QString displayVal = ui->Display->text(); double dblDisplayVal = displayVal.toDouble(); // Make sure a math button was pressed if(addTrigger || subTrigger || multTrigger || divTrigger ){ if(addTrigger){ solution = calcVal + dblDisplayVal; } else if(subTrigger){ solution = calcVal - dblDisplayVal; } else if(multTrigger){ solution = calcVal * dblDisplayVal; } else { solution = calcVal / dblDisplayVal; } } // Put solution in display ui->Display->setText(QString::number(solution)); } void Calc::ChangeNumberSign(){ // Get the value in the display QString displayVal = ui->Display->text(); // Regular expression checks if it is a number // plus sign QRegExp reg("[-+]?[0-9.]*"); // If it is a number change the sign if(reg.exactMatch(displayVal)){ double dblDisplayVal = displayVal.toDouble(); double dblDisplayValSign = -1 * dblDisplayVal; // Put solution in display ui->Display->setText(QString::number(dblDisplayValSign)); } } ————— END CALC.CPP ————— ————— MAIN.CPP ————— #include "calc.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Calc w; w.show(); return a.exec(); } ————— END MAIN.CPP ————— |
Leave a Reply