Как заставить QPushButtons добавлять текст в поле QLineEdit? - PullRequest
3 голосов
/ 29 ноября 2011

Я использовал Qt Creator, чтобы создать «клавиатурное» окно с шестьюдесятью QPushButtons и одним QLineEdit. Как сделать кнопки для добавления символов в текстовое поле QLineEdit? Если я нажимаю QPushButton с меткой «Q», я хочу, чтобы программа добавила символ Unicode «Q» в текстовое поле.

Ответы [ 3 ]

6 голосов
/ 29 ноября 2011

Один из способов сделать это - просто подключить сигнал «нажал» от всех кнопок к слоту, а затем обработать добавление символа туда.

Например, если все кнопки клавиатуры находятся внутри раскладки с именем 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() );
    }
}
3 голосов
/ 29 ноября 2011

ОПЦИЯ 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);
}
0 голосов
/ 03 мая 2014

Я создал приложение с похожей проблемой, пытаясь преобразовать текст qpushbutton в сам qlineedit.Ключ заключается в том, как вы инициализируете кнопки и используете полиморфизм в своей функции.Создание сигнала выброса не будет работать для отдельных персонажей..DigitValue будет работать в том случае, если для чисел (которые будут иметь кнопки типа int), но qt не имеет символьного значения (я должен сказать, что после 6 часов чтения qt doc и еще 4 попыток различных комбинаций он не будет работать), Я думаю, это связано с тем, сколько бит требуется для хранения каждого типа переменной в массиве.Я даже пытался преобразовать button-> text в QString для использования с функцией emit в качестве прототипа сигнала.

Я не знаю, какова ваша раскладка кнопок, но я дам вам краткий обзор того, что я сделал.Сначала я создал глобальный статический массив const char, содержащий все необходимые буквы, например,

static const char vowelarray[] = "AEIOU"; 

Затем инициализировал QPushButtons с помощью функции MainWindow, используя итерацию, установив условие завершения цикла для массива char размера(в вашем случае 60?).Это все зависит от вашего расположения кнопок, хотя.Я лично создал функцию void (setLocation) для button-> setGeometry каждой кнопки, итерировал 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];

, переменная 'letters' использовалась для извлечения и ввода текста в и из строки редактирования для дальнейших функций во всем приложении.Удачи! ``

...