カスタマイズされたウィジェットからウィジェットにアクセスするにはどうすればよいですか?カスタマイズされたウィジェットからウィジェットにアクセスするにはどうすればよいですか?
:
は、今私はQWidgetのが "マイカスタムウィジェット" を推進してきた "ユーザ情報" の形を持っている:私は、カスタマイズされたウィジェットを持って
:たとえば
カスタムウィジェットからテキストを取得するにはどうすればよいですか? (例えばQLineEdit->text()
)
カスタマイズされたウィジェットからウィジェットにアクセスするにはどうすればよいですか?カスタマイズされたウィジェットからウィジェットにアクセスするにはどうすればよいですか?
:は、今私はQWidgetのが "マイカスタムウィジェット" を推進してきた "ユーザ情報" の形を持っている:私は、カスタマイズされたウィジェットを持って
:たとえば
カスタムウィジェットからテキストを取得するにはどうすればよいですか? (例えばQLineEdit->text()
)
回答に基づいて、「私のカスタムウィジェット」のフィールドの値を取得および設定するためのゲッターおよびセッターメソッドをいくつか作成しました。今、私は私のからこれらのメソッドにアクセスすることができます
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"));
ありがとうございました。
正しい方法は、あなたの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>()
を使用して、名前によってライン編集を得ることであろう。それはカプセル化を本当に破るものであり、それ以上は説明しません。
実際、私はこのコマンドを 'findChild'コマンドを使って実行しましたが、うまくいきましたが、これは良い方法だとは思いません。私はあなたが言ったような適切なアクセサメソッドを作成しようとします。ありがとう。 – KelvinS
QLineEdit->text()
は構文が正しくなくコンパイルされません。 text()
は非スタティックメンバーであり、この呼び出しはQLineEdit
オブジェクトなしでは意味をなさないため、QLineEdit::text()
もコンパイルされません。
質問に戻ると、まずカスタムウィジェット自体にアクセスする必要があります。エディタで何とかウィジェットを名付けたらそれは、簡単です。この例では
その名前はcustomWidget
です。したがって、ui
プライベートメンバーのQDialog
クラスにはcustomWidget
という名前のパブリックメンバーがあります。タイプはMyCustomWidget
で、画像上のウィジェットに対応しています。これで、customWidget
の一般メンバーにアクセスできます。 QDialog
は、ユーザー情報ウィジェットクラスに対応しています。
たとえば、あなたは信号を宣言することがあり、信号対信号connect()
を使用してこれらの信号にQLineEdit
sからMyCustomWidget
と前方の信号に(のは彼らvalue1Changed(QString)
、value2Changed(QString)
などを呼びましょう)。次にをQDialog
のスロットまたはcustomWidget
ポインタが表示されているスコープの他のオブジェクトに接続できます。
QString getLine1Content() const
などのパブリックメソッドをMyCustomWidget
に宣言し、いつでも必要に応じてQDialog
にアクセスすることもできます。
これらは、カスタムウィジェットのメンバーにアクセスする唯一の方法ではなく、最も頻繁に使用される方法です。
'QLineEdit-> text()'コマンドは、各** QLineEdit **オブジェクトのテキストを取得したいことを示すための単なる例です。 あなたの答えをありがとう。私は実際にそれをすることを考えましたが、まずは@TobySpeightの例を試してみると思います。 – KelvinS
この質問は多すぎます。それはあなたのウィジェットをどのように作成したかによって異なります。あなたは 'uic'でUI記述をコンパイルしましたか?その場合は、UIのすべての関連する子オブジェクトへのポインタを持つオブジェクトが必要です。それを "手作業で"作成した場合は、独自のポインタを管理する必要があります。あなたのように動作するコードの[mcve]を表示してください。この質問に答えることができます。 –
「昇格」という言葉の使用から正しく推論すると、Qt DesignerでUIファイルを作成しています。したがって、カスタムウィジェットで書き込んだメソッドを使用して、それらのフィールドにアクセスするだけで済みます。 –
実際、これらのウィジェットを作成したのは私のものではありませんでしたが、私はそれらのウィジェットにアクセスする必要があります。私は彼らが "手で"作られたと思う。私は、これらのフィールドの値を設定して取得するための信号とスロットを作成する必要があると考えています。 – KelvinS