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

Posted

技术标签:

【中文标题】如何使 QPushButtons 将文本添加到 QLineEdit 框中?【英文标题】:How to make QPushButtons to add text into QLineEdit box? 【发布时间】:2011-11-29 13:14:26 【问题描述】:

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

【问题讨论】:

感谢各位的帮助,但 Qt Creator 似乎太乱了,我不知道如何处理它。 【参考方案1】:

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

例如,如果所有键盘按钮都在名为“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()) );
    

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

void MainWindow::keyboardButtonPressed()

    QPushButton* button = qobject_cast<QPushButton*>( sender() );

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

【讨论】:

【参考方案2】:

选项 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 子类化以避免多个if。在您的子类中,只需捕获鼠标释放事件并发出一个包含按钮文本的新信号

void KeyboardButton::mouseReleaseEvent(QMouseEvent* event)

   emit clicked(buttonLetter); // Where button letter a variable of every item of your subclass

将 clicked(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);

【讨论】:

子类化和 if else 级联可以通过 qobject_cast'ing sender() 到 QPushButton 并使用 text(),或者通过在每个持有要粘贴的文本。如果按钮的文本和要添加的字母不同(例如输入等),后者会提供更多的灵活性。【参考方案3】:

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

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

static const char vowelarray[] = "AEIOU"; 

然后在 MainWindow 函数中使用迭代初始化 QPushButtons,将 for 循环的终止条件设置为等于大小 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("QPushButtonbackground: 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];

变量“字母”用于从行编辑中提取和输入文本,以便在整个应用程序中实现更多功能。 祝你好运!!``

【讨论】:

以上是关于如何使 QPushButtons 将文本添加到 QLineEdit 框中?的主要内容,如果未能解决你的问题,请参考以下文章

添加文本和禁用滚动时如何使 UITextView 字段扩展?

如何使用 iText 列表将具有不同权重的文本添加到单个 ListItem

如何在 QPushButtons 上使用 mousePressEvent

Qt - QPushButtons 代替 QTreeView 项目

如何将键盘键图形表示插入到您的文档中?

Qt - 从布局中删除所有小部件?