我正在尝试更改 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 中...
对?:)