2011-11-29 7 views
3

Qt Creatorを使用して、60個のQPushButtonと1個のQLineEditを持つ「キーボード」ウィンドウを作成しました。 QLineEditテキストボックスに文字を追加するためのボタンを作成するにはどうすればよいですか? QPushButtonをラベル 'Q'で押すと、テキストボックスにUnicode文字 'Q'を追加します。QLineEditボックスにテキストを追加するQPushButtonsを作成する方法は?

+0

Qt Creatorは助けてくれてありがとうございます。しかし、Qt Creatorはとても面倒で、私はそれをどうするべきかわかりません。 – user569474

答えて

6

これを行う1つの方法は、すべてのボタンからスロットに「クリックされた」信号を接続してそこに文字を追加することです。すべてのキーボードのボタンがあなたのメイン・ウィンドウのコンストラクタで「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())); 
    } 
} 

は、次にスロットの実装では、あなたはQObjectを::送信者を使用することができます()、信号送信対象返す:

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

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

オプション1 - 複数のシグナルとスロット

あなたがクリックされたボタンを把握し、ラインエディットに対応する文字を追加する必要がbuttonClicked()スロットで

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

スロットにすべてのプッシュボタンclicked()信号を接続します。

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

OPTION 2 - サブクラスのQPushButton

あなたは、複数のIFSを避ける​​ためにQPushButtonをサブクラス化することができます。あなたのサブクラスでちょうど同様に、私はアプリケーションを作成した

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

qobject_castでsender()をQPushButtonに、text()を使用するか、貼り付けるテキストを保持する各ボタンに動的プロパティ(QObject :: setProperty)を設定することで、サブクラス化とその他のカスケードの両方を回避できます。後者は、ボタンのテキストと追加する文字が異なる場合(入力などの場合)、より柔軟になります。 –

0

スロットをクリック(QStringの)信号を接続して、マウスのリリースイベントをキャッチし、ボタンのテキスト

void KeyboardButton::mouseReleaseEvent(QMouseEvent* event) 
{ 
    emit clicked(buttonLetter); // Where button letter a variable of every item of your subclass 
} 

を含む新しい信号を発しますqpushbuttonテキストをqlineedit自体に変換しようとすると、同様の問題が発生します。キーは、ボタンを初期化する方法と、関数内で多型を使用する方法です。エミット信号を作成するには、個々の文字を扱わないでください。 .digitValueは数字の場合(ボタンはint型)、qtは文字の値を持っていません(6時間後にqt docを読んでから別の4つの組み合わせを試してみるとうまくいきません)、私は各変数型を配列に格納するのに必要なビット数と関係があると思います。私もボタン - >テキストをQStringに変換して、プロトタイプのシグナルとしてemit関数で使用しようとしました。

あなたのボタンのレイアウトはわかりませんが、私が行ったことの概要を教えてください。私は最初に必要なすべての文字を含むグローバルで静的なconst char配列を作成しました。

static const char vowelarray[] = "AEIOU"; 

そしてサイズchar配列に等しいループの終了条件の設定、反復を使用して、メインウィンドウ関数のとQPushButtonsを初期化(あなたのケース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(); 

次のコードを使用したところ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'を使用して、アプリケーション全体のさらなる機能のために行編集のテキストを抽出して入力しました。 Best Luck !! ``

関連する問題