Qt - перезагрузка содержимого виджета - PullRequest
0 голосов
/ 08 марта 2010

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

То, что я делал, было явно не правильным способом, так что я должен делать вместо этого?

Ответы [ 2 ]

2 голосов
/ 08 марта 2010

По моему быстрому предположению, вы не добавили макрос Q_OBJECT в заголовок dragwidget.h, файл moc для класса DragWidget не был сгенерирован и произошел сбой соединения с ошибкой "no Такие slot as draw ()".

Также было бы неплохо добавить «CONFIG + = console» в файл .pro - вы увидите все предупреждающие сообщения (например, об ошибке подключения), поэтому отслеживание таких ошибок будет проще. Вы также можете проверить возвращаемое значение соединения.

1 голос
/ 09 марта 2010

Я заметил, что вы открыли файл следующим образом:

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

Обратите внимание, что имя файла начинается с ":", и это означает, что файл будет считан из вашего пакета ресурсов qrc, а не с вашего локального диска. Таким образом, если вы внесли изменения в words.txt, они будут прочитаны кодом только при следующей компиляции файла qrc. Значит, вы поняли, как это исправить, верно? Удачи:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...