我正在尝试通过添加一个按钮来修改fridge magnets example,该按钮将重新加载绘制可拖动标签的小部件,反映对其读取的文本文件所做的任何更改。我定义了另一个包含按钮和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()));
}
对connect的调用就是我正在尝试刷新的东西。在原始的冰箱磁铁示例中,所有标签绘制代码都在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()而不是构造函数中也没有用完,程序最终会进入无限循环。
我所做的显然不是正确的做法,所以我应该做些什么呢?
答案 0 :(得分:2)
我的快速猜测是,你没有向dragwidget.h标头添加Q_OBJECT宏,没有生成DragWidget类的moc文件,连接失败,“没有像插槽那样的插槽()”错误。
向.pro文件添加“CONFIG + = console”可能也是一个好主意 - 您将看到所有警告消息(如关于连接错误的消息),因此跟踪此类错误会更容易。您还可以检查connect的返回值。
答案 1 :(得分:1)
我注意到你以这种方式打开文件:
QFile dictionaryFile(":/dictionary/words.txt");
请注意,文件名以“:”开头,这意味着将从qrc资源包而不是本地磁盘读取该文件。因此,如果您对words.txt进行了更改,则只有在下次编译qrc文件时才会通过代码读取它。所以你必须明白如何解决它,对吧?祝你好运:)