C ++ Qt - (虚拟)QWidget如何指向其子代?

时间:2012-08-11 01:46:33

标签: qt qwidget

我正在尝试更改QFrame的边框。 BUT。

有一个Window :: ui,其中有一个继承自QWidget的类。 在该类中,有一个QFrame,使用垂直布局设置,其中包含另外两个QFrame并执行其QFrame业务。 现在,这个结构在Window :: ui中重复了很多,所以我只是将它添加到名为kingdom_decks的垂直布局中。

到目前为止,非常好。

让我们说,我想选择其中一个元素。要标记选择,我想更改边框,从黑色到红色,或者只是将其更厚。使用QFrame,非常简单。 BUT

我的事件处理程序是Window :: ui中的一个插槽。 ui转到kingdom_decks布局,然后转到所选项目。 itemAt retourn一个QLayoutItem,我可以使用widget()转换为QWidget ......但是呢?

ui->kingdom_decks->itemAt(idx_prev)->widget()

我尝试失败了

 ui->kingdom_decks->itemAt(idx_prev)->widget()->childAt(0,0)

我认为它失败了,因为布局中有一个Qframe,而不是带有真正coordonates的几何形式,或者我可能不够深入?

无论如何,非常感谢您提出任何想法!谢谢你的时间。

修改

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的确切实例?

编辑:

好的,我可以将我的架构改为这样的东西:

创建Cards_kingdom * vec

的向量

在for循环中,    vec.push_back(new Card_kingdom *);    UI-&GT;&版图GT; addWIdget(VEC [I])

所以现在,我认为这样可行,因为布局是持有指向我的小部件的指针,所以我通过引用传递,因此,如果我在对象中更改某些内容,即使我没有,它也会出现在GUI中经过那里......

右? :)

1 个答案:

答案 0 :(得分:0)

Qt的有趣之处在于布局可以成为巢和层和迷宫,但我只是有一个不同的扭曲这个问题,我个人会去寻找ui->findChild<QFrame *>("frameObjectName")的内容(如果你已经创建了QFrame作为指针,如果不是只是删除*)并从那里访问它。您需要确保为框架填充了一个对象名称,但这并不太难并且有其他好处。