2016-08-23 29 views
1

カスタマイズされたウィジェットからウィジェットにアクセスするにはどうすればよいですか?カスタマイズされたウィジェットからウィジェットにアクセスするにはどうすればよいですか?

enter image description here

enter image description here

は、今私はQWidgetのが "マイカスタムウィジェット" を推進してきた "ユーザ情報" の形を持っている:私は、カスタマイズされたウィジェットを持って

:たとえば

カスタムウィジェットからテキストを取得するにはどうすればよいですか? (例えばQLineEdit->text()

+0

この質問は多すぎます。それはあなたのウィジェットをどのように作成したかによって異なります。あなたは 'uic'でUI記述をコンパイルしましたか?その場合は、UIのすべての関連する子オブジェクトへのポインタを持つオブジェクトが必要です。それを "手作業で"作成した場合は、独自のポインタを管理する必要があります。あなたのように動作するコードの[mcve]を表示してください。この質問に答えることができます。 –

+0

「昇格」という言葉の使用から正しく推論すると、Qt DesignerでUIファイルを作成しています。したがって、カスタムウィジェットで書き込んだメソッドを使用して、それらのフィールドにアクセスするだけで済みます。 –

+0

実際、これらのウィジェットを作成したのは私のものではありませんでしたが、私はそれらのウィジェットにアクセスする必要があります。私は彼らが "手で"作られたと思う。私は、これらのフィールドの値を設定して取得するための信号とスロットを作成する必要があると考えています。 – KelvinS

答えて

0

回答に基づいて、「私のカスタムウィジェット」のフィールドの値を取得および設定するためのゲッターおよびセッターメソッドをいくつか作成しました。今、私は私のからこれらのメソッドにアクセスすることができます

void MyCustomWidget::setNameLineEdit(QString value) 
{ 
    ui->nameLineEdit->setText(value); 
} 

QString MyCustomWidget::getNameLineEdit() 
{ 
    return ui->nameLineEdit->text(); 
} 

... 

を:

public: 
    void setNameLineEdit(QString value); 
    QString getNameLineEdit(); 

    void setAddressLineEdit(QString value); 
    QString getAddressLineEdit(); 

    void setPhoneLineEdit(QString value); 
    QString getPhoneLineEdit(); 

そして:私はゲッターセッター各フィールドのを作成し、私のMyCustomWidgetクラスで

UserInfoクラス:

ui->myCustomWidget->setNameLineEdit(QString("Paul")); 

ありがとうございました。

1

正しい方法は、あなたのMyCustomWidget実装では、適切なアクセサメソッドを作成することです:

namespace Ui { 
    class MyCustomWidget; 
} 

class MyCustomWidget : public QWidget 
{ 
    // You may also wish to add WRITE and NOTIFY methods; 
    // that's left as an exercise for the reader. 
    Q_PROPERTY(QString name READ name) 

    const std::unique_ptr<Ui::MyCustomWidget> ui; 

public: 
    explicit MyCustomWidget(QWidget *parent = 0); 
    ~MyCustomWidget(); 

    QString name() const; 
}; 
#include "ui_mycustomwidget.h" 

// Constructor and destructor 
MyCustomWidget::MyCustomWidget(QWidget *parent) : 
    QWidget(parent), 
    ui(new Ui::MyCustomWidget) 
{} 

MyCustomWidget::~MyCustomWidget() = default; 

// Accessor 
QString MyCustomWidget::name() const 
{ 
    return ui->nameEdit->text(); 
} 

あなたはその後、通常でUserInfoの方法の中からMyCustomWidget::name()メソッドを呼び出すことができますway:

ui->customWidget->name(); 

あなたも同様のaccを作成したいと思うでしょうもちろん、address()phone()のエッセーもあります。


ハック方法はQObject::findChild<QLineEdit>()を使用して、名前によってライン編集を得ることであろう。それはカプセル化を本当に破るものであり、それ以上は説明しません。

+0

実際、私はこのコマンドを 'findChild'コマンドを使って実行しましたが、うまくいきましたが、これは良い方法だとは思いません。私はあなたが言ったような適切なアクセサメソッドを作成しようとします。ありがとう。 – KelvinS

1

QLineEdit->text()は構文が正しくなくコンパイルされません。 text()は非スタティックメンバーであり、この呼び出しはQLineEditオブジェクトなしでは意味をなさないため、QLineEdit::text()もコンパイルされません。

質問に戻ると、まずカスタムウィジェット自体にアクセスする必要があります。エディタで何とかウィジェットを名付けたらそれは、簡単です。この例では

enter image description here

その名前はcustomWidgetです。したがって、uiプライベートメンバーのQDialogクラスにはcustomWidgetという名前のパブリックメンバーがあります。タイプはMyCustomWidgetで、画像上のウィジェットに対応しています。これで、customWidgetの一般メンバーにアクセスできます。 QDialogは、ユーザー情報ウィジェットクラスに対応しています。

たとえば、あなたは信号を宣言することがあり、信号対信号connect()を使用してこれらの信号にQLineEdit sからMyCustomWidgetと前方の信号に(のは彼らvalue1Changed(QString)value2Changed(QString)などを呼びましょう)。次にをQDialogのスロットまたはcustomWidgetポインタが表示されているスコープの他のオブジェクトに接続できます。

QString getLine1Content() constなどのパブリックメソッドをMyCustomWidgetに宣言し、いつでも必要に応じてQDialogにアクセスすることもできます。

これらは、カスタムウィジェットのメンバーにアクセスする唯一の方法ではなく、最も頻繁に使用される方法です。

+0

'QLineEdit-> text()'コマンドは、各** QLineEdit **オブジェクトのテキストを取得したいことを示すための単なる例です。 あなたの答えをありがとう。私は実際にそれをすることを考えましたが、まずは@TobySpeightの例を試してみると思います。 – KelvinS

関連する問題