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