2012-01-04 36 views
5

Tôi có một lớp được gọi là FindAndReplaceBar, mà thực hiện là:Nhiều lỗi định nghĩa: một trong tệp của tôi và một tệp trong tệp moc.

#include "FindAndReplaceBar.h" 
#include <QLabel> 
#include <QPushButton> 
#include <QGridLayout> 
#include <QTextDocument> 
#include <QLineEdit> 

FindAndReplaceBar::FindAndReplaceBar(QObject *parent) : 
    QToolBar(NULL) 
{ 
    lblFind   = new QLabel("Find: ",this); 
    lblReplace  = new QLabel("Replace",this); 

    ledtFind  = new QLineEdit(this); 
    ledtReplace  = new QLineEdit(this); 

    QPixmap next(":/res/resources/next.gif"); 
    QPixmap previous(":/res/resources/previous.gif"); 
    QPixmap close(":/res/resources/close_icon.gif"); 

    btnFindNext  = new QPushButton(QIcon(next),"",this); 
    btnFindPrevious = new QPushButton(QIcon(previous),"",this); 
    btnClose  = new QPushButton(QIcon(close),"",this); 

    btnReplace  = new QPushButton("Replace",this); 
    btnReplaceAll = new QPushButton("Replace All",this); 

    btnFindNext->setFlat(true); 
    btnFindPrevious->setFlat(true); 
    btnClose->setFlat(true); 
    btnReplace->setFlat(true); 
    btnReplaceAll->setFlat(true); 

    lytFindAndReplaceBar  = new QGridLayout(this); 

    lytFindAndReplaceBar->addWidget(lblFind,0,0,1,1); 
    lytFindAndReplaceBar->addWidget(ledtFind,0,1,1,2); 
    lytFindAndReplaceBar->addWidget(btnFindPrevious,0,3,1,1); 
    lytFindAndReplaceBar->addWidget(btnFindNext,0,4,1,1); 

    lytFindAndReplaceBar->addWidget(lblReplace,0,5,1,1); 
    lytFindAndReplaceBar->addWidget(ledtReplace,0,6,1,2); 
    lytFindAndReplaceBar->addWidget(btnReplace,0,8,1,1); 
    lytFindAndReplaceBar->addWidget(btnReplaceAll,0,9,1,1); 

    this->setLayout(lytFindAndReplaceBar); 

    connect(btnFindNext,SIGNAL(clicked()),this,SIGNAL(findNext())); 
    connect(btnFindPrevious,SIGNAL(pressed()),this,SIGNAL(findPrevious())); 
    connect(btnClose,SIGNAL(pressed()),this,SLOT(close())); 
    connect(btnReplace,SIGNAL(pressed()),this,SIGNAL(replace())); 
    connect(btnReplaceAll,SIGNAL(pressed()),this,SIGNAL(replaceAll())); 

    this->setStyleSheet("QToolBar{background: qlineargradient(x1:0,x2:0,y1:0,y2:1,stop:0 #fffaf0,stop:0.3 #fdf5e6)} QLineEdit{border-radius:4px;padding:2px;}"); 
} 

void FindAndReplaceBar::findNext() 
{ 
    emit find(0); 
} 

void FindAndReplaceBar::findPrevious() 
{ 
    emit find(QTextDocument::FindBackward); 
} 

void FindAndReplaceBar::replace() 
{ 
    emit replace(false); 
} 

void FindAndReplaceBar::replaceAll() 
{ 
    emit replace(true); 
} 

QString FindAndReplaceBar::searchTerm() 
{ 
    return this->ledtFind->text(); 
} 

QString FindAndReplaceBar::replaceTerm() 
{ 
    return this->ledtReplace->text(); 
} 

void FindAndReplaceBar::setSearchFieldText(const QString & searchFieldText) 
{ 
    this->ledtFind->setText(searchFieldText); 
} 

void FindAndReplaceBar::setReplaceFieldText(const QString & replaceFieldText) 
{ 
    this->ledtReplace->setText(replaceFieldText); 
} 

Khi tôi chạy chương trình tôi nhận được vấn đề của nhiều định nghĩa về các chức năng:

findNext(), findPrevious(), replace(), replaceAll().

Định nghĩa khác được thực hiện trong tệp moc_FindAndReplaceBar.cpp. Tôi không chắc vấn đề này nên tôi không biết cách sửa nó! Tôi thực sự sẽ đánh giá cao sự giúp đỡ nào, cảm ơn!

+0

Cố gắng làm đầy đủ, sạch sẽ xây dựng. Đôi khi mọi thứ trở nên không đồng bộ. – Mat

+0

Tôi đã làm. Tôi nhận được một hộp thoại rằng moc_FindAndReplaceBar đã được gỡ bỏ và tôi muốn lưu nó với một tên khác. Tôi nghĩ đổi tên nó có thể tạo ra vấn đề lớn hơn vì vậy tôi chỉ cần bấm vào 'Lưu' –

+0

Hình như hệ thống xây dựng của bạn là nhầm lẫn. Loại bỏ các tập tin moc để chúng được tái sinh. – Mat

Trả lời

11

Đánh giá bởi các cuộc gọi kết nối của bạn (tín hiệu để báo hiệu), tôi giả sử nếu chúng ta nhìn vào tập tin tiêu đề của bạn, bạn sẽ có tuyên bố findNext(), findPrevious(), replace(), replaceAll() như tín hiệu, nhưng bạn không phải thực hiện các tín hiệu - họ chỉ cần được khai báo trong tiêu đề.

Từ các tài liệu Qt trên signals

Signals are automatically generated by the moc and must not be implemented in the .cpp file. They can never have return types (i.e. use void).

+0

Đó chính xác là những gì tôi đã làm. Cảm ơn, tôi có thể lấy nó từ đây :) –

+0

Tôi chỉ cần chạy vào này là tốt. Một sai lầm dễ dàng khi bạn khai báo các tín hiệu đầu tiên, sau đó sao chép và dán vào một lớp khác và quên thay đổi tín hiệu thành các khe :) – anr78

Các vấn đề liên quan