繁体   English   中英

Qt-重新加载小部件内容

[英]Qt - reloading widget contents

我正在尝试通过添加一个按钮来修改冰箱磁铁的示例 ,该按钮将重新加载绘制可拖动标签的小部件,以反映对其读取的文本文件所做的任何更改。 我定义了另一个包含按钮和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()”的公共方法中,并从构造函数中调用了该方法。 这是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()而不是构造函数中的效果也不理想,该程序最终将陷入无限循环。

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

我的快速猜测是,您尚未向dragwidget.h标头中添加Q_OBJECT宏,未生成DragWidget类的moc文件,并且连接失败,并出现“没有诸如draw()这样的插槽”错误。

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

我注意到您以这种方式打开文件:

QFile dictionaryFile(":/dictionary/words.txt");

请注意,文件名以“:”开头,这意味着将从您的qrc资源包而不是本地磁盘中读取文件。 因此,如果您对words.txt进行了更改,则只有在下次编译qrc文件时,它才会被代码读取。 因此,您必须了解如何解决它,对吗? 祝好运:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM