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

时间:2011-11-29 13:14:26

标签: qt virtual-keyboard

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

3 个答案:

答案 0 :(得分:6)

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

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

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()) );
    }
}

然后在槽实现中,你可以使用QObject :: sender(),它返回发送信号的对象:

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

    if ( button )
    {
        ui->lineEdit->insert( button->text() );
    }
}

答案 1 :(得分:3)

选项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);
}

答案 2 :(得分:0)

我创建了一个类似问题的应用程序,尝试将qpushbutton文本转换为qlineedit本身。关键是如何初始化按钮并在函数中使用多态。创建发射信号不适用于单个角色。 .digitValue将适用于如果为数字的情况(按钮将是int类型),但qt没有字符值(我应该说在阅读qt doc 6小时后和另外4个尝试不同的组合它将无法工作),我认为这与在数组中存储每个变量类型所需的位数有关。我甚至尝试将button-&gt;文本转换为QString,以将emit函数用作信号原型。

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

static const char vowelarray[] = "AEIOU"; 

然后在MainWindow函数中使用迭代初始化QPushButtons,设置for循环的终止条件等于char数组的大小(在你的情况下为60?)。这一切都取决于您的按钮布局。我个人为每个按钮的button-&gt; 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();

然后创建了一个void函数(例如void MainWindow :: characterPuched()),其中使用了以下代码:

void MainWindow::characterPushed(){
    QPushButton *characterButton = (QPushButton*) sender();
    if (characterButton )
    {
        lineEdit -> setText(letters.insert(letters.size(), characterButton -> text()));
    }
    lineEdit -> setText(letters);

}

当然,字母也是一个全局变量:

QString letters = "";  

当然QPushButtons和函数在头文件中是原型,作为私有变量和插槽,例如。

private:
    QPushButton *characterButton[26];

变量&#39;字母&#39;用于从行编辑中提取和输入文本,以便在整个应用程序中使用其他功能。 最好的运气!!``