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