【问题标题】:Issue with Qt Calculator - c++Qt计算器的问题 - c++
【发布时间】:2016-01-22 09:08:15
【问题描述】:

我在 Qt 中创建了一个简单的计算器,但是我正在尝试添加一个按钮来做一个阶乘,但它不起作用 有人可以帮我吗? 我已经实现了一个方法阶乘

#include "mainwindow.h"
#include <QtCore/QCoreApplication>

QString value="",total="";
double fNum,sNum;
bool addBool=false, substractBool=false, multiplyBool=false, divideBool=false,Factorbool=false;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    label=new QLabel("0",this);
    label->setGeometry(QRect(QPoint(75,25),QSize(50,200)));

    clear_button=new QPushButton("C",this);
    clear_button->setGeometry(QRect(QPoint(50,300),QSize(50,50)));
    connect(clear_button,SIGNAL(released()),this,SLOT(clear()));

    equals_button=new QPushButton("=",this);
    equals_button->setGeometry(QRect(QPoint(100,300),QSize(50,50)));
    connect(equals_button,SIGNAL(released()),this,SLOT(equals()));

    add_button=new QPushButton("+",this);
    add_button->setGeometry(QRect(QPoint(200,150),QSize(50,50)));
    connect(add_button,SIGNAL(released()),this,SLOT(add()));

    Factor_button =new QPushButton("n!",this);
    Factor_button->setGeometry(QRect(QPoint(250,150),QSize(50,50)));
    connect(Factor_button ,SIGNAL(released()),this,SLOT(add()));

    substract_button=new QPushButton("-",this);
    substract_button->setGeometry(QRect(QPoint(200,200),QSize(50,50)));
    connect(substract_button,SIGNAL(released()),this,SLOT(substract()));

    multiply_button=new QPushButton("X",this);
    multiply_button->setGeometry(QRect(QPoint(200,250),QSize(50,50)));
    connect(multiply_button,SIGNAL(released()),this,SLOT(multiply()));

    divide_button=new QPushButton("/",this);
    divide_button->setGeometry(QRect(QPoint(200,300),QSize(50,50)));
    connect(divide_button,SIGNAL(released()),this,SLOT(divide()));

    for(int i=0;i<10;i++){
        QString digit=QString::number(i);
        buttons[i]=new QPushButton(digit,this);
        connect(buttons[i],SIGNAL(released()),this,SLOT(buttonPushed()));
    }
    setGeo();
}

void MainWindow::setGeo()
{
    for(int i=0;i<1;i++)
    {
        buttons[i]->setGeometry(QRect(QPoint(50,300),QSize(50,50)));
    }
    for(int i=0;i<4;i++)
    {
        buttons[i]->setGeometry(QRect(QPoint(50*i,250),QSize(50,50)));
    }
    for(int i=4;i<7;i++)
    {
        buttons[i]->setGeometry(QRect(QPoint(50*(i-3),200),QSize(50,50)));
    }
    for(int i=7;i<10;i++)
    {
        buttons[i]->setGeometry(QRect(QPoint(50*(i-6),150),QSize(50,50)));
    }
}

void MainWindow::buttonPushed()
{
    QPushButton *button=(QPushButton *)sender();
    emit numberEnitted(button->text()[0].digitValue());
    value+=QString::number(button->text()[0].digitValue());
    label->setText(value);
}

void MainWindow::clear(){
    value="";
    label->setText(value);

}

void MainWindow::add(){
    fNum=value.toDouble();
    value="";
    label->setText(value);
    addBool=true;
}
 int factorial( int n)
{
    if (n == 0)
       return 1;
    return n * factorial(n - 1);
}


void MainWindow::equals(){
    sNum=value.toDouble();
    if(addBool){
        total=QString::number(fNum+sNum);
        label->setText(total);
    }
    if(substractBool){
        total=QString::number(fNum-sNum);
        label->setText(total);
    }
    if(multiplyBool){
        total=QString::number(fNum*sNum);
        label->setText(total);
    }
    if(divideBool){
        total=QString::number(fNum/sNum);
        label->setText(total);
    }
    if(Factorbool)
    {
        total=QString::number(factorial(fNum));
        label->setText(total);
    }
}


void MainWindow::substract(){
    fNum=value.toDouble();
    value="";
    label->setText(value);
    substractBool=true;
}

void MainWindow::multiply(){
    fNum=value.toDouble();
    value="";
    label->setText(value);
    multiplyBool=true;
}

void MainWindow::divide(){
    fNum=value.toDouble();
    value="";
    label->setText(value);
    divideBool=true;
}
void MainWindow::Factor(){
    fNum=value.toDouble();
    value="";
    label->setText(value);
    Factorbool=true;
}
MainWindow::~MainWindow()
{
}

主要

#include "mainwindow.h"
#include <QApplication>
#include <QDesktopWidget>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.showMaximized();
    w.setFixedSize(300,400);
    w.move(QApplication::desktop()->screen()->rect().center()-w.rect().center());
    w.show();

    return a.exec();
}

.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QLabel>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

signals:
    void numberEnitted(int number);

private slots:
    void clear();
    void add();
    void equals();
    void substract();
    void multiply();
    void divide();
    void Factor();
    void buttonPushed();
    void setGeo();

private:
    QLabel *label;
    QPushButton *clear_button;
    QPushButton *add_button;
    QPushButton *equals_button;
    QPushButton *substract_button;
    QPushButton *multiply_button;
    QPushButton *Factor_button;
    QPushButton *divide_button;
    QPushButton *zero_button;
    QPushButton *buttons[10];

};

#endif

我正在等待你的帮助:)

【问题讨论】:

  • it's not working 是什么意思?!按钮不出现?如果单击按钮没有任何反应?出现错误的阶乘结果?碰撞?编译器错误?电脑重启,硬盘被格式化?

标签: c++ qt calculator


【解决方案1】:

按下Factor_button 时触发的信号未连接到正确的插槽。

这一行

    connect(Factor_button, SIGNAL(released()), this, SLOT(add()));

应该是

    connect(Factor_button, SIGNAL(released()), this, SLOT(Factor()));

【讨论】:

  • 非常感谢我有一个额外的问题,我如何不点击equals直接显示它
  • 假设我点击 9,然后点击阶乘按钮,我希望它自动显示结果
  • 我实际上并没有尝试您的程序,但我想您可以将与当前在MainWindow::equals() 中的阶乘相关的代码添加到MainWindow::Factor() 的末尾。所以尝试将total=QString::number(factorial(fNum)); label-&gt;setText(total); 添加到MainWindow::Factor() 的末尾。然后清理多余的代码。
  • 顺便问一下,connect 更改是否解决了您原来的问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
相关资源
最近更新 更多