0

QFrame の境界線を変更しようとしています。しかし。

Window::ui があり、その中に QWidget から継承したクラスがあります。そのクラスには、垂直レイアウトで設定された QFrame があり、これは他の 2 つの QFrame を保持し、QFrame ビジネスを実行します。さて、この構造は Window::ui で何度も繰り返されるので、それを Kingdom_decks という名前の垂直レイアウトに単純に追加しました。

ここまでは順調ですね。

たとえば、それらの要素の 1 つを選択したいとします。選択範囲をマークするには、境界線を黒から赤に変更するか、単に太くします。QFrame を使えば、とても簡単です。しかし

私のイベント ハンドラは Window::ui のスロ​​ットです。uiKingdom_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に表示されます。 ...

右?:)

4

1 に答える 1

0

Qt の楽しい点は、レイアウトがネストやレイヤー、迷路になる可能性があることですが、私はちょうどこの問題に別のひねりを加えたところにあるので、個人的にはui->findChild<QFrame *>("frameObjectName")(QFrame をポインターとして作成した場合は、 *) をドロップしてそこからアクセスするだけではない場合。フレームのオブジェクト名が入力されていることを確認する必要がありますが、それはそれほど難しくなく、他の利点もあります。

于 2012-08-12T16:26:52.743 に答える