尝试将 QLayout“”添加到已经有布局的 convertidorNumericoDialogo“”[重复]

Posted

技术标签:

【中文标题】尝试将 QLayout“”添加到已经有布局的 convertidorNumericoDialogo“”[重复]【英文标题】:Attempting to add QLayout "" to convertidorNumericoDialogo "" which already has a layout [duplicate] 【发布时间】:2021-11-05 21:43:39 【问题描述】:

朋友们怎么了,我得到了标题的问题,程序与 3 QLineEdit 一起工作,其中第一个是引入十进制数,第二个是十六进制数,第三个是二进制数。

当我引入一个十进制数时,我得到了有效的信号,然后它将十六进制值放入第二个 QLineEdit(它由信号转换),并以相同的方式用于二进制值。

直到这里,在工作之前(但不是现在),在我输入一个代码来引入二进制或十六进制之后,它变成了十进制,另一个 val...

我需要你的帮助,也许我什么都没看到......这实际上是我第一次使用 QGidLayout 等。

接下来是我的代码:

convertidorNumerico.cpp 的代码


#include "convertidornumerico.h"

convertidorNumerico::convertidorNumerico(QObject *parent) : QObject(parent)




void convertidorNumerico::setDec(const QString &cadena)

    bool ok;
    int num = cadena.toInt(&ok);
    if ( ok )
    
        emit hexChanged(QString::number(num, 16));
        emit binChanged(QString::number(num, 2));
    
    else
    
        emit hexChanged("");
        emit binChanged("");
    


void convertidorNumerico::setHex(const QString &cadena)

    bool ok;
    int num = cadena.toInt(&ok, 16);
    if ( ok )
    
        emit decChanged(QString::number(num));
        emit binChanged(QString::number(num, 2));
    
    else
    
        emit decChanged("");
        emit binChanged("");
    


void convertidorNumerico::setBin(const QString &cadena)

    bool ok;
    int num = cadena.toInt(&ok);
    if ( ok )
    
        emit decChanged(QString::number(num));
        emit hexChanged(QString::number(num, 16));
    
    else
    
        emit decChanged("");
        emit hexChanged("");
    



convertidorNumerico.h 的代码


#ifndef CONVERTIDORNUMERICO_H
#define CONVERTIDORNUMERICO_H

#include <QObject>

class convertidorNumerico : public QObject

    Q_OBJECT
public:
    explicit convertidorNumerico( QObject *parent = nullptr );

signals:
    void decChanged(const QString &);
    void hexChanged(const QString &);
    void binChanged(const QString &);

public slots:
    void setDec(const QString &);
    void setHex(const QString &);
    void setBin(const QString &);
;

#endif // CONVERTIDORNUMERICO_H


convertidorNumericoDialogo.cpp的代码


#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QIntValidator>
#include <QRegularExpression>
#include <QRegularExpressionValidator>

#include "convertidornumericodialogo.h"
#include "convertidornumerico.h"

/*convertidorNumericoDialogo::convertidorNumericoDialogo(QObject *parent) : QObject(parent)


*/

convertidorNumericoDialogo::convertidorNumericoDialogo()

    QVBoxLayout *mainLayout = new QVBoxLayout   ( this );
    QGridLayout *editLayout = new QGridLayout   ( this );
    QHBoxLayout *btnLayout = new QHBoxLayout    ( this );

    QLabel *decLabel = new QLabel("decimal");
    QLabel *hexLabel = new QLabel("Hexadecimal");
    QLabel *binLabel = new QLabel("Binario");

    decEdit = new QLineEdit;
    hexEdit = new QLineEdit;
    binEdit = new QLineEdit;

    editLayout->addWidget(decLabel, 0, 0);
    editLayout->addWidget( decEdit, 0, 1 );
    editLayout->addWidget( hexLabel, 1, 0 );
    editLayout->addWidget( hexEdit, 1, 1 );

    editLayout->addWidget(binLabel, 2, 0);
    editLayout->addWidget(binEdit, 2, 1);

    QPushButton *btnSalir = new QPushButton("SALIR");
    btnLayout->addStretch();
    btnLayout->addWidget(btnSalir);

    mainLayout->addLayout(editLayout);
    mainLayout->addStretch();
    mainLayout->addLayout(btnLayout);

    btnSalir->setDefault(true);
    connect(btnSalir, SIGNAL(released()), this, SLOT(accept()));

    // VALORES DE UN BYTE : 0 - 255
    QIntValidator *decVal = new QIntValidator(0, 255, decEdit);
    decEdit->setValidator(decVal);

    // EXP REG PARA VALIDAR HEXADECIMALES DE HASTA 2 DIGITOS....
    QRegularExpressionValidator *hexVal = new QRegularExpressionValidator(
                QRegularExpression("^[0-9A-Fa-f]1,2"), hexEdit);
    hexEdit->setValidator(hexVal);

    // EXP REG PARA VALIDAR BINARios DE HASTA 8 BYTES....
    QRegularExpressionValidator *binVal = new QRegularExpressionValidator(
                QRegularExpression("[0-1]1,8"), binEdit);
    binEdit->setValidator(binVal);

    convertidorNumerico *convertidor = new convertidorNumerico;

    connect(decEdit, SIGNAL(textChanged(QString)), convertidor, SLOT(setDec(QString)));
    connect(convertidor, SIGNAL(hexChanged(QString)), hexEdit, SLOT(setText(QString)));
    connect(convertidor, SIGNAL(binChanged(QString)), binEdit, SLOT(setText(QString)));


    // tarea: => CONECTAR las señales de hexa y binario, para que ingresando esos datos, se devuelva la info en la app.
    connect(hexEdit, SIGNAL(textChanged(QString)), convertidor, SLOT(setHex(QString)));
    connect(binEdit, SIGNAL(textChanged(QString)), convertidor, SLOT(setBin(QString)));
    connect(convertidor, SIGNAL(decChanged(QString)), decEdit, SLOT(setText(QString)));



convertidorNumericoDialogo.h 的代码


#ifndef CONVERTIDORNUMERICODIALOGO_H
#define CONVERTIDORNUMERICODIALOGO_H

#include <QDialog>


class QLineEdit;
class convertidorNumericoDialogo : public QDialog

    Q_OBJECT
public:
    //explicit convertidorNumericoDialogo(QObject *parent = nullptr);
    explicit convertidorNumericoDialogo();

private:
    QLineEdit *decEdit;
    QLineEdit *hexEdit;
    QLineEdit *binEdit;

;

#endif // CONVERTIDORNUMERICODIALOGO_H


有什么解决办法吗?我做了一切,但我没有让它工作......

【问题讨论】:

我需要添加它正在工作的程序(中间),因为当我在任何 QLineEdit 中引入一个值时,会放入我没有放入 QLineEdit 的随机值。 【参考方案1】:

你正在设置多个布局,改变这个:

QVBoxLayout *mainLayout = new QVBoxLayout   ( this );
QGridLayout *editLayout = new QGridLayout   ( this );
QHBoxLayout *btnLayout = new QHBoxLayout    ( this );

QVBoxLayout *mainLayout = new QVBoxLayout   ( this );
QGridLayout *editLayout = new QGridLayout;
QHBoxLayout *btnLayout = new QHBoxLayout;

见https://doc.qt.io/qt-5/qlayout.html#QLayout

【讨论】:

message 已解决,但应用程序的功能不是......当我在 QLineEdit 上放置一个值时,它会放置一个我没有放置的随机值......例如,我想在 QLineEdit 中输入 43 作为 decimal ,但它输入了 11013782 而我没有输入... 嗨。这个问题是关于布局问题的。你描述的是一个单独的问题,应该作为一个单独的问题发布。

以上是关于尝试将 QLayout“”添加到已经有布局的 convertidorNumericoDialogo“”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

QT。向 QLayout 添加新布局

Qt - 如何控制 QLayout 中的小部件大小

缺少 QLayout 构造函数来实现卡片布局

QT自定义布局示例有关Overlappig小工具无法编译

Quasar中的QLayout

10.1 QLayout布局管理器基类