簡體   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