Я пытаюсь изменить пример магниты на холодильник , добавив кнопку, которая перезагрузит виджет, где отображаются перетаскиваемые метки, отражая любые изменения, внесенные в текстовый файл, который он читает. Я определил другой класс, который будет содержать кнопку и объект 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 () вместо конструктора также не сработало, программа оказалась бы в бесконечном цикле.
То, что я делал, было явно не правильным способом, так что я должен делать вместо этого?