[英]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.