qpushbutton的奇怪自动点击

问题描述

我一直在尝试通过销售软件项目来学习c ++和qt框架。我的主窗口有几个选项卡,在一个选项卡中,我有一个qpushbutton,可以打开一个新的购买对话框,该对话框将用户输入的内容输入到记录从供应商处的新采购。此newpurchase对话框具有一个行编辑,当从条形码读取器接收到产品条形码时,将触发另一个数量对话框,用户可以使用该对话框输入产品的数量。但是当我在数量对话框的按钮框上单击确定而不是仅关闭数量对话框时,它也将关闭newpurchase对话框。我调试了qt应用程序,它显示一个qpushbutton(用于保存和关闭newpurchase对话框)在newpuchase对话框会自动触发。此外,仅当通过条形码lineedit触发数量对话框时才发现此行为,我还有另一个lineedit接受产品描述并触发相同的数量对话框,但是当数量对话框通过触发时单击ok按钮Description lineedit不会关闭newpurchase对话框或触发qpushbutton来保存并关闭newpurchase对话框。im会附加对话框的屏幕快照和对话框代码

在mainwindow.cpp上

   void MainWindow::on_pushButton_clicked()
{
    newpurchase mypurchase;
    connect(&mypurchase,SIGNAL(purchase_added()),this,SLOT(update_view()));
    mypurchase.exec();
}

newpurchase对话框 newpurchase.cpp

#include "newpurchase.h"
#include "ui_newpurchase.h"
#include <QtDebug>
#include <qtablewidget.h>
#include <QsqlQuery>
#include <QsqlError>
#include <QsqlRecord>
#include <QCompleter>
#include <QObject>
#include <QWidget>
#include <QDate>

newpurchase::newpurchase(QWidget *parent) :
    QDialog(parent),ui(new Ui::newpurchase)
{
    ui->setupUi(this);
    QsqlQuery qry;
    qry.prepare("select description from product");
    if(!qry.exec())
    {
        qDebug() << "error getting description from product";
    }
    QStringList items;
    while(qry.next())
    {
        items <<qry.value(0).toString();
    }
    QCompleter *completer =new QCompleter(items,this);
    completer->setCaseSensitivity(Qt::CaseInsensitive);
    ui->lineEdit_descripion->setCompleter(completer);
  connect(completer,static_cast<void (QCompleter::*)(const QString&)>(&QCompleter::activated),[&](const QString &text)->void

    {
        newpurchase::clear(text);
    });

    QsqlQuery supqry;
    supqry.prepare("select supplier_name from supplier");
    if(!supqry.exec())
    {
        qDebug() << "error getting suppliername from supplier";
    }
    QStringList supitems;
    while(supqry.next())
    {
        supitems <<supqry.value(0).toString();
    }
    QCompleter *supcompleter =new QCompleter(supitems,this);
    supcompleter->setCaseSensitivity(Qt::CaseInsensitive);
    ui->lineEdit_sup->setCompleter(supcompleter);
}

newpurchase::~newpurchase()
{
    delete ui;
}

void newpurchase::on_lineEdit_barcode_returnpressed()
{
    if(!ui->lineEdit_sale->text().isEmpty() && !ui->lineEdit_sup->text().isEmpty() && !ui->lineEdit_inv->text().isEmpty())
    {
        quantity_dialog quandialog;
        connect(&quandialog,SIGNAL(purdetails(QString)),SLOT(code(QString)));
       quandialog.exec();
    }
    else
    {

        Errdialog myerror("please provide supplier and invoice" );
        myerror.exec();
    }
}
void newpurchase::saveDataIntoTable(QString item,double price,int quantity,QString code,QString date)
{
    double rupee =price*quantity*1.00;
    //qDebug() <<date;

    QString mrp= QString::number(rupee,'f',2);
    QString qty= QString::number(quantity);
    QString prc= QString::number(price);
    // QString kod= QString::number(code);

    if (!ui->tableWidget)
        return;

    const int currentRow = ui->tableWidget->rowCount();
    ui->tableWidget->setRowCount(currentRow + 1);

    ui->tableWidget->setItem(currentRow,new QTableWidgetItem(item));
    ui->tableWidget->setItem(currentRow,1,new QTableWidgetItem(prc));
    ui->tableWidget->setItem(currentRow,2,new QTableWidgetItem(qty));
    ui->tableWidget->setItem(currentRow,3,new QTableWidgetItem(mrp));
    ui->tableWidget->setItem(currentRow,4,new QTableWidgetItem(code));
    ui->tableWidget->setItem(currentRow,5,new QTableWidgetItem(date));

    double total=ui->label_3->text().todouble();
    total = total+rupee;
    ui->label_3->setText(QString::number(total,2));



}
void newpurchase::clear(QString item)
{
    if(!item.isEmpty())
    {
        if(!ui->lineEdit_des->text().isEmpty() && !ui->lineEdit_sup->text().isEmpty() && !ui->lineEdit_inv->text().isEmpty())
        {
            quantity_dialog quandialog;
            connect(&quandialog,SLOT(descr(QString)));
            quandialog.exec();

        }
        else
        {

            Errdialog myerror("please provide supplier and invoice" );
            myerror.exec();
        }
    }
}

void newpurchase::descr(QString q)
{
    QStringList elements = q.split(':');
    QsqlQuery qry;
    qry.prepare("select * from product where description='"+ui->lineEdit_des->text()+"'");
    if(!qry.exec())
    {
        qDebug() << "error getting table product";
    }
    if (qry.next())
    {
        QString result=qry.value(1).toString();
        double cost= elements[1].todouble();
        QString itemco=qry.value(2).toString();
        int quan=elements[0].toInt();
        QString mfd=elements[2];
        saveDataIntoTable(result,cost,quan,itemco,mfd);
        ui->lineEdit_des->clear();
    }
}
void newpurchase::on_pushButton_clicked()
{

    QItemSelectionModel *select =ui->tableWidget->selectionModel();
    int row = select->selectedRows().takeFirst().row();
    double rupee=ui->tableWidget->item(row,3)->text().todouble();
    ui->tableWidget->removeRow(row);
    double total=ui->label_3->text().todouble();
    total = total-rupee;
    ui->label_3->setText(QString::number(total,2));


}

void newpurchase::on_lineEdit_des_returnpressed()
{
}
void newpurchase::code(QString q)
{

    QStringList elements = q.split(':');

    QsqlQuery qry;
    qry.prepare("select * from product where code="+ui->lineEdit_sale->text());
    if(!qry.exec())
    {
        qDebug() << "error getting table product";
    }
    if (qry.next())
    {
        QString result=qry.value(1).toString();
        double cost= elements[2].todouble();
        QString itemco=qry.value(2).toString();
        int quan=elements[0].toInt();
        QString mfd=elements[1];


        saveDataIntoTable(result,mfd);

    }


    ui->lineEdit_sale->clear();
}




void newpurchase::on_pushButton_2_clicked()
{

    QString datetime= QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
    QString supplier=ui->lineEdit_sup->text();
    QString invoice=ui->lineEdit_inv->text();
    int numrow=ui->tableWidget->rowCount();
   // qDebug() << numrow;

    for (int i = 0; i < numrow; i++)
    {

        QsqlQuery query;
        query.prepare("SELECT MAX(Id) FROM stock_transaction");
        if(!query.exec())
        {
            qDebug() << "error getting id";
        }
        int id=0 ;
        if (query.next())
        {
            id=query.value(0).toInt()+1;
        }

        QString coder=ui->tableWidget->item(i,4)->text();
        QString qua=ui->tableWidget->item(i,2)->text();
        double rate=ui->tableWidget->item(i,1)->text().todouble();
        QString date= ui->tableWidget->item(i,5)->text();
        QString d=QString::number(id);
        QString batch=supplier+"_"+invoice+"_"+d;

        QsqlQuery querysale;

        querysale.prepare("INSERT INTO stock_transaction(id,code,stock,mfd,supplier,invoice,date_time) VALUES(:id,:code,:stock,:mfd,:supplier,:invoice,:cost,:date_time)");

        querysale.bindValue(":id",id);
        querysale.bindValue(":code",coder);
        querysale.bindValue(":stock",qua.toInt());
        querysale.bindValue(":mfd",date);
        querysale.bindValue(":supplier",supplier);
        querysale.bindValue(":invoice",invoice);
        querysale.bindValue(":cost",rate*1.00);
        querysale.bindValue(":date_time",datetime);



        if(!querysale.exec())
        {
            qDebug() << "error recording sale";
        }
        
    }
    emit this->purchase_added();
    close();

}

数量对话框

quantity.cpp

#include "quantity_dialog.h"
    #include "ui_quantity_dialog.h"

     quantity_dialog::quantity_dialog(QWidget *parent) :
                                QDialog(parent),ui(new Ui::quantity_dialog)
                            {
                                ui->setupUi(this);
                                ui->lineEdit_quan->setFocus();
                                ui->buttonBox->setEnabled(false);
                                connect(ui->lineEdit_quan,SIGNAL(textChanged(QString)),SLOT(checkLineEdits()));
                                connect(ui->dateEdit,SIGNAL(dateChanged(QDate)),SLOT(checkLineEdits()));
                                connect(ui->lineEdit_3,SLOT(checkLineEdits()));
                            }
                            
                            quantity_dialog::~quantity_dialog()
                            {
                                delete ui;
                            }
                            
                            void quantity_dialog::on_buttonBox_accepted()
                            {
                                emit purdetails(ui->lineEdit_quan->text()+":"+ui->dateEdit->text()+":"+ui->lineEdit_3->text());
                            
                            
                                ui->lineEdit_quan->clear();
                            
                            }

请告知我是否可以提供其他详细信息

解决方法

设置了自动点击qpushbutton的自动默认属性。更改此属性可以解决我的问题