0

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

有一个Window::ui,里面有一个继承自QWidget的类。在那个类中,有一个 QFrame,设置了一个垂直布局,它拥有 2 个其他 QFrame 并执行他们的 QFrame 业务。现在,这个结构在 Window::ui 中重复了很多次,所以我简单地将它添加到一个名为 Kingdom_decks 的垂直布局中。

到现在为止还挺好。

假设,我想选择其中一个元素。为了标记选择,我想改变边框,从黑色到红色,或者只是让它变粗。有了QFrame,很容易。但

我的事件处理程序是 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,而不是具有真正坐标的几何形式,或者我可能没有深入?

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

编辑

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 是一个类,例如:

卡片王国.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->layout->addWIdget(vec[i])

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

对?:)

4

1 回答 1

0

Qt 的有趣之处在于布局可以变成嵌套、层和迷宫,但我刚刚遇到了这个具有不同转折的确切问题,我个人会寻求类似的东西ui->findChild<QFrame *>("frameObjectName")(如果您将 QFrame 创建为指针,如果不只是删除 *) 并从那里访问它。您需要确保为框架填充了对象名称,但这并不太难,而且还有其他好处。

于 2012-08-12T16:26:52.743 回答