2

少数のQTextEditsのtextChanged()シグナルを追跡しようとしています。信号を発するテキスト編集に関係なく同じことをしたい:QListWidgetが空になった場合は、関連するチェックボックスをオフにし、そうでない場合はチェックしたままにします。私がそうしている機能は次のとおりです。

void MainWindow::changed()
{
    QString tempStr = ui->hNMRedit->toPlainText();
    if(tempStr != "")
    {
       ui->checkList->item(0)->setCheckState(Qt::Checked);
    }
    else
    {
       ui->checkList->item(0)->setCheckState(Qt::Unchecked);
    }
}

現在のアプローチでは、すべてのQTextEditに対してこのような関数を作成する必要があります。各関数には、実質的に同一のコードが含まれています。各テキスト編集を配列に保存した場合(QListWidgetで関連するインデックスを見つけることができるように)、このようなスロットを持つことは可能でしょうか?

void MainWindow::changed(QWidget *sender)   // for whichever text edit emits the
                                            // textChanged() signal
{
    QString tempStr = sender->toPlainText();
    if(tempStr != "")
    {
       // I would potentially use some sort of indexOf(sender) function on the array I 
       // mentioned earlier here... a little new to Qt, sorry
       ui->checkList->item(array.indexOf(sender))->setCheckState(Qt::Checked);
    }
    else
    {
       // same as above...
       ui->checkList->item(array.indexOf(sender))->setCheckState(Qt::Unchecked);
    }
}

これは可能ですか、それともテキスト編集ごとに個別のスロットを作成する必要がありますか?さらに詳しい説明が必要な場合はお知らせください。

最後に、QLineEditsとQTextEditsの唯一の意味のある違いは、デフォルトのサイズだと思います。一貫性を保つために、UI全体でこれらのオブジェクトの1つを使用する必要がありますか?

ありがとう!!!

4

2 に答える 2

3

スロットとシグナルのポイントが欠けていると思います。どのように接続を作成していますか?テキストボックスのいずれかが変更されたときにチェックボックスをオンにしようとしていますか?その場合は、QSignalMapperを使用して信号をマップし、textChanged()trueの値を送信し、それをQCheckBoxsetChecked(bool)スロットに接続します。

それが複雑すぎる場合は、サブクラスQCheckBoxを作成しcheckBox() uncheckBox()、変数なしで状態を切り替えることができるように関数のセットを作成します。次に、QTextEdittextChanged()をサブクラスに接続しますcheckBox()

これが探しているものでない場合は、少なくともサブクラスQTextEditを使用して、QTextEditごとにコードを複製する代わりに、テキストが変更されたときに変更できるQCheckBoxを取り込みます。

于 2010-01-30T21:33:49.667 に答える
0

必要なのは、でキー設定されたのハッシュQAbstractButton*ですQTextEdit*。スロットsender()で、ハッシュを検索します。見つかった場合は、必要なボタンがあります。これはまさに、送信者からボタンにQSignalMapperマップできることによって行われることです。にキャストするために使用します。QWidget*QWidget*qobject_castQAbstractButton*

于 2012-05-07T19:22:57.103 に答える