QFrame の境界線を変更しようとしています。しかし。
Window::ui があり、その中に QWidget から継承したクラスがあります。そのクラスには、垂直レイアウトで設定された QFrame があり、これは他の 2 つの QFrame を保持し、QFrame ビジネスを実行します。さて、この構造は Window::ui で何度も繰り返されるので、それを Kingdom_decks という名前の垂直レイアウトに単純に追加しました。
ここまでは順調ですね。
たとえば、それらの要素の 1 つを選択したいとします。選択範囲をマークするには、境界線を黒から赤に変更するか、単に太くします。QFrame を使えば、とても簡単です。しかし
私のイベント ハンドラは Window::ui のスロットです。ui
Kingdom_decks レイアウトに移動し、選択したアイテムに移動します。itemAt は、widget() を使用して QWidget としてキャストできる QLayoutItem を返します...しかし、その後は?
ui->kingdom_decks->itemAt(idx_prev)->widget()
失敗しました
ui->kingdom_decks->itemAt(idx_prev)->widget()->childAt(0,0)
実際の座標を持つジオメトリ形式ではなく、レイアウトに Qframe があるために失敗したと思いますか、それとも十分に深く踏み込んでいないのでしょうか?
とにかく、それについてのアイデアをよろしくお願いします!御時間ありがとうございます。
編集
window.cpp のコード
#include "window.h"
#include "ui_window.h"
Window::Window(Game_state * p, Card_generator * d, QWidget *parent) :
QDialog(parent),
ui(new Ui::Window)
{
ui->setupUi(this);
/*Stuff happen here*/
/* Display cards*/
for (int i = 0; i < 10; ++i){
/*Add widget to layout*/
ui->kingdom_decks->addWidget(new Cards_kingdom(decks->decks_kingdom[i]),0,i);
/*Connect widget to map*/
connect(ui->kingdom_decks->itemAt(i)->widget(), SIGNAL(mousePressEvent()), signal_mapper, SLOT(map()));
/*Map widget and data*/
signal_mapper->setMapping(ui->kingdom_decks->itemAt(i)->widget(), i);
}
/* Action "Select cards" */
connect(signal_mapper, SIGNAL(mapped(int)), this, SLOT(card_kingdom_selected(int)));
}
Window::~Window()
{
delete ui;
}
/*Implementation of SLOT*/
void Window::card_kingdom_selected(int idx){
/*...*/
//?????????????? What to do here???????????
//ui->findChild<QLabel *>("img");
//ui->kingdom_decks->itemAt(idx)->widget()->????;
}
ここで何が起こるかというと、レイアウト Kingdom_decks があり、そこでループしてウィジェット Cards_kingdom を追加し、関数 addWidget をオーバーロードします。
ui->kingdom_decks->addWidget(new Cards_kingdom(decks->decks_kingdom[i]),0,i);
この Object Cards_kingdom は、次のようなクラスです。
cards_kingdom.h :
class Cards_kingdom : public QWidget {
public:
Cards_kingdom(Deck_kingdom * input_deck); /* Constructor */
bool isSelected();
QLabel * get_img();
/*
* Price and Counter are display in the same label, then are wrapped with Icon in a vertical layout, inside a frame.
*/
private:
QLabel *img; /* Icon */
QLabel *info; /* Nb Cards left*/
QVBoxLayout *layout; /* Layout */
QFrame *pack; /* Frame */
Deck_kingdom *deck; /* Type Deck */
bool select;
};
window.cpp で、 を取得してQLabel * img
、この画像に境界線を付けて、ユーザーが選択されていることを確認しようとしました。
@Nicholas Smithに答えるには、どのようにfindChildを見つけて、の正確なインスタンス化を見つけることができますCard_kingdom
か?
編集:
OK、アーキテクチャを次のように変更できます。
Cards_kingdom * vec のベクトルを作成します
for ループでは、 vec.push_back(new Card_kingdom *); ui->layout->addWIdget(vec[i])
レイアウトはウィジェットへのポインタを保持しているので、参照渡しなので、オブジェクトで何かを変更すると、そこを通り過ぎなくてもGUIに表示されます。 ...
右?:)