2012-03-13 15 views
10

Tôi đã tạo một hộp kiểm cũng là một QTreeWidgetItem sử dụng mã bên dưới.Có thể tạo tín hiệu khi hộp kiểm QTreeWidgetItem được bật không?

//Populate list 
QTreeWidgetItem *program = createCheckedTreeItem(QString::fromStdString(itr->first), true); 
treePrograms->addTopLevelItem(program); 

QTreeWidgetItem* ConfigDialog::createCheckedTreeItem(QString name,bool checkBoxState) 
{ 
    QTreeWidgetItem *item = new QTreeWidgetItem(QStringList(name)); 
    item->setFlags(item->flags()|Qt::ItemIsUserCheckable); 
    if (checkBoxState) 
    { 
    item->setCheckState(0,Qt::Unchecked); 
    } 
    else 
    { 
    item->setCheckState(0,Qt::Checked); 
    } 
    return item; 
} 

Tôi cần một cách để kết nối tín hiệu và khe cắm cho khi trạng thái của hộp kiểm này được thay đổi. Cách hiện tại tôi đã thực hiện điều này là dưới đây, nhưng tiếc là không hoạt động. Ai đó có thể giải thích những gì tôi đang làm sai và những gì tôi cần làm để có được nó để kết nối?

connect(program, SIGNAL(toggled(bool)), this, SLOT(programChecked(bool))); 

Trả lời

4

QTreeWidgetItem của bạn được liên kết trực tiếp đến dữ liệu mô hình của bạn, vì vậy bạn nên kết nối với QAbstractItemModel::dataChanged tín hiệu của mô hình của QTreeWidget của bạn để được thông báo về sự thay đổi.

+3

Điều này không đúng. QTreeWidget không có mô hình người dùng. –

+0

@GHuxley Nhưng bạn vẫn có thể kết nối với mô hình mặc định cơ bản của QTreeWidget, ví dụ: 'treeWidget.model(). dataChanged.connect (handle_dataChanged)'. Không chắc chắn nếu điều này là tốt hơn so với chỉ kết nối với 'itemChanged' nhưng nó có vẻ tương tự. – blah238

6

Bạn phải lấy tín hiệu itemChanged (QTreeWidgetItem * item, int column) đến từ QTreeWidget.

+1

Điều này là không tốt vì nó sẽ được báo hiệu liên tục khi dữ liệu cây cũng thay đổi. –

3

Kết nối với tín hiệu itemClicked(QTreeWidgetItem* item, int column) của cây. Khi xử lý tín hiệu, chỉ cần xác minh item->checkState(column).

+0

Khi người dùng nhấp vào chỉ hộp kiểm, điều này sẽ không được báo hiệu. Ví dụ: người dùng nhấp vào mục. Sau đó nhấp vào hộp kiểm. CheckState sẽ không được gọi trên hộp kiểm. Điều này đúng với ít nhất cho Qt 5.3 – Chrismit

+0

Tôi đang sử dụng tốt trong Qt 5.3.1 tại thời điểm này, trên cả Mac và Win. –

+0

Tác phẩm này, nhưng bạn phải kiểm tra trạng thái đã chọn của mục đối với mô hình của riêng bạn để thay đổi. – kainjow

3

Giải pháp tốt nhất chúng tôi thấy được để reimplement SetData trong một lớp con mục:

void MyItem::setData(int column, int role, const QVariant& value) 
{ 
    const bool isCheckChange = column == 0 
     && role == Qt::CheckStateRole 
     && data(column, role).isValid() // Don't "change" during initialization 
     && checkState(0) != value; 
    QTreeWidgetItem::setData(column, role, value); 
    if (isCheckChange) { 
     MyTree *tree = static_cast<MyTree *>(treeWidget); 
     emit tree->itemCheckStateChanged(this, checkState(0) == Qt::Checked); 
    } 
} 

Nó sẽ thực sự được thuận tiện để có điều này trong Qt trên thực tế, nó làm cho tôi suy nghĩ về góp một tín hiệu itemCheckStateChanged có trực tiếp :)

PS: đặt Qt :: ItemIsUserKiểm tra là không cần thiết, cờ này được bật theo mặc định cho tất cả QTreeWidgetItems.

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