Qt 如何使QPushButtons将文本添加到QLineEdit框中?

Qt 如何使QPushButtons将文本添加到QLineEdit框中?,qt,virtual-keyboard,Qt,Virtual Keyboard,我使用QtCreator创建了一个“键盘”窗口,其中有60个QpushButton和一个QLineEdit。如何制作向QLineEdit文本框添加字符的按钮?如果我按下带有标签“Q”的QPushButton,我希望程序在文本框中添加Unicode字符“Q”。一种方法是将所有按钮的“单击”信号连接到一个插槽,然后在那里处理字符的添加 例如,如果所有键盘按钮都位于名为“buttonLayout”的布局内,则在主窗口构造函数中可以执行以下操作: for (int i = 0; i < ui-&g

我使用QtCreator创建了一个“键盘”窗口,其中有60个QpushButton和一个QLineEdit。如何制作向QLineEdit文本框添加字符的按钮?如果我按下带有标签“Q”的QPushButton,我希望程序在文本框中添加Unicode字符“Q”。

一种方法是将所有按钮的“单击”信号连接到一个插槽,然后在那里处理字符的添加

例如,如果所有键盘按钮都位于名为“buttonLayout”的布局内,则在主窗口构造函数中可以执行以下操作:

for (int i = 0; i < ui->buttonLayout->count(); ++i)
{
    QWidget* widget = ui->buttonLayout->itemAt( i )->widget();
    QPushButton* button = qobject_cast<QPushButton*>( widget );

    if ( button )
    {
        connect( button, SIGNAL(clicked()), this, SLOT(keyboardButtonPressed()) );
    }
}
for(int i=0;ibuttonLayout->count();++i)
{
QWidget*widget=ui->buttonLayout->itemAt(i)->widget();
QPushButton*button=qobject_cast(小部件);
如果(按钮)
{
连接(按钮,信号(点击()),此,插槽(键盘按钮按下());
}
}
然后在插槽实现中,可以使用QObject::sender(),它返回发送信号的对象:

void MainWindow::keyboardButtonPressed()
{
    QPushButton* button = qobject_cast<QPushButton*>( sender() );

    if ( button )
    {
        ui->lineEdit->insert( button->text() );
    }
}
void主窗口::键盘按钮按下()
{
QPushButton*button=qobject_cast(sender());
如果(按钮)
{
用户界面->行编辑->插入(按钮->文本());
}
}

选项1-多个信号和插槽

将所有按钮
clicked()
信号连接到插槽

// Let button01 be the A 
connect(ui->button01, SIGNAL(clicked()), this, SLOT(buttonClicked()));
...
// Let button 60 be the Q
connect(ui->button60, SIGNAL(clicked()), this, SLOT(buttonClicked()));
buttonClicked()
窗口中,您必须找出单击了哪个按钮,并将相应的字母附加到行编辑中

void buttonClicked()
{
    QObject* callingButton = QObject::sender();
    if (callingButton == button01)
        ui->lineEdit->setText(ui->lineEdit->text()+ "A");
    ...
    else if (callingButton == button60)
        ui->lineEdit->setText(ui->lineEdit->text()+ "Q");
}
选项2-子类QPushButton

您可以子类化
QPushButton
,以避免出现多个ifs。在您的子类中,只需捕获鼠标释放事件并发出一个包含按钮文本的新信号

void KeyboardButton::mouseReleaseEvent(QMouseEvent* event)
{
   emit clicked(buttonLetter); // Where button letter a variable of every item of your subclass
}
类似地,将单击的(QString)信号连接到插槽

connect(ui->button01, SIGNAL(clicked(QString)), this, SLOT(buttonClicked(QString)));
...
connect(ui->button60, SIGNAL(clicked(QString)), this, SLOT(buttonClicked(QString)));

void buttonClicked(QString t)
{
    ui->lineEdit->setText(ui->lineEdit->text()+ t);
}

我创建了一个具有类似问题的应用程序,试图将qpushbutton文本转换为qlineedit本身。关键是如何初始化按钮以及如何在函数中使用多态性。创建发射信号对单个字符无效。如果对于数字(按钮类型为int),则.digitValue将起作用,但qt没有字符值(我应该说,在读取qt doc 6小时后,再尝试4次不同的组合后,它将不起作用),我认为这与在数组中存储每种变量类型所需的位数有关。我甚至尝试将button->text转换为QString,以便将emit函数用作信号原型

我不知道你的按钮布局是什么,但我会给你一个我做了什么的概要。我首先创建了一个全局静态常量字符数组,其中包含所有需要的字母,例如

static const char vowelarray[] = "AEIOU"; 
然后在主窗口函数中使用迭代初始化QPushButtons,将for循环的终止条件设置为等于size char数组(在您的示例中为60?)。这一切都取决于你的按钮布局。我个人为每个按钮的button->setGeometry创建了一个void函数(setLocation),并迭代了setGeometry,然后在函数结束时将该函数传递给MainWindow函数。以下代码用于初始化按钮、将信号连接到插槽以及使用多态性连接到lineedit

for (int i = 0; i < 26; i++){
    characterButton[i] = new QPushButton(chararry[i], this);    `
    characterButton[i] -> setStyleSheet("QPushButton{background: grey; color: brown}");
    connect(characterButton[i],SIGNAL(released(),this,SLOT(characterPushed()));
}

setLocation();
当然,字母是一个全局变量,而且:

QString letters = "";  
当然,QPushButtons和函数在头文件中是作为私有变量和插槽的原型,例如

private:
    QPushButton *characterButton[26];
变量“letters”用于从行编辑中提取和输入文本,以便在整个应用程序中实现进一步的功能。
祝你好运``

子类化和if-else级联都可以通过qobject_cast'ing sender()到QPushButton并使用text()来避免,或者通过在保存要粘贴的文本的每个按钮上设置动态属性(qobject::setProperty)来避免。如果按钮的文本和要添加的字母不同(如回车等),则后者提供了更多的灵活性。谢谢大家的帮助,伙计们,但是Qt Creator看起来太乱了,我不知道该怎么处理它。
private:
    QPushButton *characterButton[26];