2011-05-30 47 views
1

我試圖在Qt中實現一個有兩個子窗口小部件的窗口小部件:一個是渲染區域,我在這裏繪製一些點並連接它們之間的線,另一個是我想要插入的ListBox我用繪製區域的座標繪製的所有點的列表。使用Qt Designer添加的2個小部件。這裏是我的代碼至今:如何通知小部件有關Qt中另一個小部件的更改?

renderarea.h:


class RenderArea : public QWidget 
{ 
    Q_OBJECT 

public: 
    RenderArea(QWidget *parent = 0); 
    QPoint point; 
    QList&ltQPoint> list; 

protected: 
    void mousePressEvent(QMouseEvent *); 
    void paintEvent(QPaintEvent *event); 
    void updateList(QPoint p); 
}; 

renderarea.cpp:


RenderArea::RenderArea(QWidget *parent) 
    : QWidget(parent) 
{ 
    setBackgroundRole(QPalette::Base); 
    setAutoFillBackground(true); 
} 

void RenderArea::mousePressEvent(QMouseEvent *e) 
{ 
    point = e->pos(); 
    updateList(point); 
    this->update(); 
} 

void RenderArea::updateList(QPoint p) 
{ 
    list.append(p); 
} 
void RenderArea::paintEvent(QPaintEvent * /* event */) 
{ 
    QPainter painter(this); 
    painter.setPen(QPen(Qt::black,2)); 
    for (int i = 0; i < list.size(); ++i) 
     painter.drawPoint(list[i]); 
    if (list.size()>1) 
     for(int j = 0; j < list.size()-1; ++j) 
       painter.drawLine(list[j], list[j+1]); 
} 

paintwidget.h:


class PaintWidget : public QWidget 
{ 
    Q_OBJECT 

public: 
    explicit PaintWidget(QWidget *parent = 0); 
    ~PaintWidget(); 

private: 
    Ui::PaintWidget *ui; 
}; 

paintwidget.cpp:


PaintWidget::PaintWidget(QWidget *parent) : 
     QWidget(parent), 
     ui(new Ui::PaintWidget) 
{ 
    ui->setupUi(this); 
} 

PaintWidget::~PaintWidget() 
{ 
    delete ui; 
} 

我的問題是如何從渲染區域小部件列表框我發送我畫了另一點,它應該在列表中的座標一起顯示?

+0

爲什麼使用'新'和'刪除'而不是隻包含一個值? – Puppy 2011-05-30 12:55:46

回答

1

OrcunC給了你一個很好的建議。 如果您是信號/插槽實施的新手,那麼您可以從一些提示開始。

renderarea.h

signal: 
    void pointAdded(QPoint*); 

renderarea.cpp

void RenderArea::updateList(QPoint p) 
{ 
    list.append(p); 
    emit pointAdded(&list.back()); 
} 

listbox.h

public slots: 
    void onPointAdded(QPoint*); 

listbox.cpp

void ListBox::onPointAdded(QPoint* point) 
{ 
    //lets assume your ListBox is a QListWidget 
    addItem(QString::number(point->x()) + "," + QString::number(point->y())) 
} 

ListBox和RenderArea的某個實例都可以訪問

QObject::connect(renderArea, SIGNAL(pointAdded(QPoint*), 
        listBox, SLOT(onPointAdded(QPoint*))); 

注:nameing是在這種情況下的可讀性和維護void RenderArea::updateList(QPoint p)非常重要的它更void RenderArea::addPoint(const QPoint& p)(也注意到const reference告訴編譯器我們不會改變p事件,如果我們有它的參考)

+0

嗨,我試過你的代碼,但它仍然無法正常工作。它只是說 對象::連接:沒有這樣的插槽QListWidget :: onPointAdded(QPoint *)在.. \ paintWidget \ paintwidget.cpp:13 對象::連接:(發件人名稱: 'displayWidget') 對象:: connect :(接收器名稱:'listWidget') 它只是沒有找到插槽。 – schmimona 2011-05-30 13:27:08

+0

'QListWidget :: onPointAdded(QPoint *)'不直接存在於Qt中。你必須在QListWidget之上實現你自己的類**,就像'class ListBox:public QListWidget'一樣,在Qt中看到一些例子。然後在**你的**'ListBox'中定義並實現你的插槽,然後連接它。 – vrince 2011-05-30 13:56:37

+0

謝謝,它現在有效。 – schmimona 2011-05-31 09:44:02

4

QT開發中使用的一般方法是使用signal/slots進行軟件組件之間的通信。所以基本上你需要在你的源組件中定義一個信號(例如RenderArea或者你喜歡的),並且將你在另一個組件中定義的插槽(即你的窗口窗口)連接起來,然後通過一個動作發出一個信號。

在引用的鏈接中也有示例。

相關問題