gpt4 book ai didi

c++ - Qt - 重新加载小部件内容

转载 作者:行者123 更新时间:2023-11-28 01:12:03 24 4
gpt4 key购买 nike

我正在尝试修改 fridge magnets example通过添加一个按钮,该按钮将重新加载绘制可拖动标签的小部件,反射(reflect)对其读取的文本文件所做的任何更改。我定义了另一个包含按钮和 DragWidget 对象的类,因此在 main() 中将有一个此类的实例而不是 DragWidget:

class wrapWidget: public QWidget
{
Q_OBJECT
public:
wrapWidget();

};

wrapWidget::wrapWidget()
{
QGridLayout *gridlayout = new QGridLayout();
DragWidget *w = new DragWidget();
QPushButton *b = new QPushButton("refresh");
gridlayout ->addWidget(w,0,0);
gridlayout ->addWidget(b,1,0);
setLayout(gridlayout );

connect(b,SIGNAL(clicked()),w,SLOT(draw()));
}

连接调用是我尝试执行刷新操作的地方。在最初的冰箱贴示例中,所有标签绘制代码都在 DragWidget 类的构造函数中。我将该代码移至名为“draw()”的公共(public)方法,并改为从构造函数调用此方法。下面是 DragWidget 的定义和实现:

#include <QWidget>

QT_BEGIN_NAMESPACE
class QDragEnterEvent;
class QDropEvent;
QT_END_NAMESPACE

class DragWidget : public QWidget
{
public:
DragWidget(QWidget *parent = 0);

public slots:
void draw();

protected:
void dragEnterEvent(QDragEnterEvent *event);
void dragMoveEvent(QDragMoveEvent *event);
void dropEvent(QDropEvent *event);
void mousePressEvent(QMouseEvent *event);
void paintEvent(QPaintEvent *event);
};

DragWidget::DragWidget(QWidget *parent)
: QWidget(parent)
{

draw();

QPalette newPalette = palette();
newPalette.setColor(QPalette::Window, Qt::white);
setPalette(newPalette);

setMinimumSize(400, 100);//qMax(200, y));
setWindowTitle(tr("Fridge Magnets"));
setAcceptDrops(true);
}

void DragWidget::draw(){
QFile dictionaryFile(":/dictionary/words.txt");
dictionaryFile.open(QFile::ReadOnly);
QTextStream inputStream(&dictionaryFile);

int x = 5;
int y = 5;

while (!inputStream.atEnd()) {
QString word;
inputStream >> word;
if (!word.isEmpty()) {
DragLabel *wordLabel = new DragLabel(word, this);
wordLabel->move(x, y);
wordLabel->show();
wordLabel->setAttribute(Qt::WA_DeleteOnClose);
x += wordLabel->width() + 2;
if (x >= 245) {
x = 5;
y += wordLabel->height() + 2;
}
}
}
}

我认为也许将 draw() 作为插槽调用就足以重新加载标签,但它没有用。将 draw() 调用放在小部件的重写 paintEvent() 而不是构造函数中也没有效果,程序将陷入无限循环。

我这样做显然不是正确的做法,那么我应该怎么做呢?

最佳答案

我的快速猜测是,您没有将 Q_OBJECT 宏添加到 dragwidget.h header ,没有生成 DragWidget 类的 moc 文件并且连接失败并出现“没有像 draw() 这样的插槽”错误。

将“CONFIG += console”添加到 .pro 文件可能也是一个好主意 - 您会看到所有警告消息(如关于连接错误的消息),因此跟踪此类错误会更容易。您还可以检查连接的返回值。

关于c++ - Qt - 重新加载小部件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2402374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com