Qt从入门到放弃之:实例计算器

tech2025-04-03  15

知识点

QPushButton信号函数clicked(void)QLineEdit信号函数textChanged(const QString&)QString编译期间直接生成的宏QStringLiteral(str)数字验证器,只允许输入数字内容 lineEdit->setValidator(new QDoubleValidator(this));//数字验证器在创建按钮或其他控件时,可以定义一个类中的私有成员函数来完成控件的创建以及槽函数连接,在创建函数形参表中使用const char* member接收需要绑定的自定义槽函数,传递槽函数实参时使用SLOT(mySolt()) //创建按钮时,调用创建函数来创建,传递创建按钮所要连接的自定义的槽函数 m_Button = createButton(QLatin1String("="),SLOT(clickButton())); //创建按钮并连接指定槽函数的实现 QPushButton *MainWindow::createButton(const QString& name, const char *member) { QPushButton* button = new QPushButton(name,this); button->setEnabled(false); //信号和槽连接 connect(button,SIGNAL(clicked()),this,member); return button; } //槽函数的实现 void MainWindow::clickButton() { //计算结果并显示 double num = m_editL->text().toDouble()+m_editR->text().toDouble(); m_editO->setText(QString::number(num)); }

运行效果

当左操作数或右操作数为空时将禁用等号pushbutton,在左右操作数两个lineEdit中使用数字验证器设置只可以输入数字

文件结构

代码

Calculator.pro

QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++11 # The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your compiler). Please consult the documentation of the # deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS # You can also make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. # You can also select to disable deprecated APIs only up to a certain version of Qt. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp \ mainwindow.cpp HEADERS += \ mainwindow.h # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target

mainwindow.h

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QLineEdit> #include <QPushButton> #include <QLabel> #include <QHBoxLayout> #include <QDebug> #include <QDoubleValidator> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); public://func void initWindow(); public slots: void enableButton(void); void clickButton(void); private://func QLineEdit* createLineEdit(const char* member=nullptr,bool readOnlycli = false); QPushButton* createButton(const QString& name,const char* member); private: QLineEdit* m_editL;//左操作数 QLineEdit* m_editR;//右操作数 QLineEdit* m_editO;//输出框 QLabel* m_labelA;//加号label QPushButton* m_Button;//等号按钮 }; #endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { initWindow(); } MainWindow::~MainWindow() { } void MainWindow::initWindow() { //1.界面初始化 setWindowTitle("Calculator");//设置窗口标题 QFont font;//设置字体的大小 font.setPointSize(20); setFont(font);//应用字体到窗口 resize(600,600); //创建和初始化控件 m_editL = createLineEdit(SLOT(enableButton())); m_editR = createLineEdit(SLOT(enableButton())); m_editO = createLineEdit(nullptr ,true); m_labelA = new QLabel("+",this); m_Button = createButton(QLatin1String("="),SLOT(clickButton())); //添加布局 //没有效果?? // QHBoxLayout* layout = new QHBoxLayout; // layout->addWidget(m_editL); // layout->addWidget(m_lableA); // layout->addWidget(m_editR); // layout->addWidget(m_Button); // layout->addWidget(m_editO); // this->setLayout(layout);//应用布局器 //手动调整位置 m_editL->move(50,30) ; m_labelA->move(180,30); m_editR->move(200,30) ; m_Button->move(300,30) ; m_editO->move(400,30) ; } void MainWindow::enableButton() { //当左右输入框有一个为空,就将禁用等号button if(m_editR->text() != ""&&m_editL->text() != ""){ m_Button->setEnabled(true); } else m_Button->setEnabled(false); } void MainWindow::clickButton() { //计算结果并显示 double num = m_editL->text().toDouble()+m_editR->text().toDouble(); m_editO->setText(QString::number(num)); } QLineEdit *MainWindow::createLineEdit(const char *member,bool readOnly) { QLineEdit *lineEdit = new QLineEdit(this); lineEdit->setAlignment(Qt::AlignRight);//右对齐 lineEdit->setValidator(new QDoubleValidator(this));//数字验证器 if(readOnly){ lineEdit->setReadOnly(readOnly); } if(member){ //信号和槽连接 connect(lineEdit,SIGNAL(textChanged(const QString)),this,member); } return lineEdit; } QPushButton *MainWindow::createButton(const QString& name, const char *member) { QPushButton* button = new QPushButton(name,this); button->setEnabled(false); //信号和槽连接 connect(button,SIGNAL(clicked()),this,member); return button; }

main.cpp

#include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
最新回复(0)