Russian Qt Forum
Ноябрь 24, 2024, 17:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QTableWidget встроить QCheckBox и связать со слотом  (Прочитано 20347 раз)
n4ela
Гость
« : Апрель 21, 2009, 01:31 »

Есть QTableWidget надо в каждой ячейки столбца создать по checkbox'y и отслеживать изменение их состояний.
На самом деле я попробовал уже много вариантов которые пришли мне в голову, но пока что не получилось.
Вот один из них
Код:
QTableWidgetItem *temp = new ::QTableWidgetItem;
temp->setCheckState(Qt::Checked);
ui->tableWidget->setItem(1,1,temp);
Чекбокс создается, но как отслеживать изменение состояние?
Я думал что что нибудь типа
Код:
connect(temp, SIGNAL(toggled(bool)), MainWindow, SLOT(close()));
Но выдает ошибку
expected primary-expression before ‘,’ token

Еще я ради интереса посмотрел как это можно сделаьт в TreeWidget'e
ui->treeWidget->topLevelItem(j)->setCheckState(2, Qt::Checked);
Но опять же как связать со слотом?

Вобще мне надо осуществить это с QTableWidget, а с TreeWidget это уже просто ради интереса.
Буду очень благодарен если кто поможет.
Записан
registrationfedser87
Гость
« Ответ #1 : Апрель 21, 2009, 06:32 »

Повесь свою обработку на сигнал:
Код
C++ (Qt)
void QTableWidget::itemChanged ( QTableWidgetItem * item );
и уже в своём слоте проверяй состояние у item
Записан
Barmaglodd
Гость
« Ответ #2 : Апрель 21, 2009, 07:36 »

А почему не унаследоваться от QAbstractItemModel и не проверять Qt::CheckStateRole?
Записан
n4ela
Гость
« Ответ #3 : Апрель 21, 2009, 11:47 »

Я так и не понял как со слотом связать.
Ну вот есть h файл
Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QtGui/QMainWindow>
#include <QtGui/QTableWidgetItem>
#include <QtGui/QMessageBox>
 
namespace Ui
{
   class MainWindow;
}
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
private:
   Ui::MainWindow *ui;
   void check( QTableWidgetItem * );
 
};
 
#endif // MAINWINDOW_H
 
cpp файл.
Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent), ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   ui->tableWidget->setColumnWidth(0,150);
   ui->tableWidget->setRowCount(2);
   QTableWidgetItem *temp = new QTableWidgetItem;
   temp->setCheckState(Qt::Checked);
   ui->tableWidget->setItem(1,1,temp);
   MainWindow::check(temp);
 
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
void MainWindow::check(QTableWidgetItem *temp)
{
   if ( temp->checkState() == Qt::Unchecked )
   QMessageBox::warning(this, QString::fromLocal8Bit("test"), QString::fromLocal8Bit("test"));
}
 

И как теперь связать чекбокс которой в QTableWidget с функцией check?
Записан
spirit
Гость
« Ответ #4 : Апрель 21, 2009, 11:59 »

через QTableWidget::itemClicked.
Записан
n4ela
Гость
« Ответ #5 : Апрель 21, 2009, 12:22 »

Если в cpp файле в конструкторе написать
Код
C++ (Qt)
QObject::connect(ui->tableWidget, SIGNAL(itemClicked(QTableWidgetItem*)), MainWindow, SLOT(check()));
то выдаст
expected primary-expression before ‘,’ token
Записан
spirit
Гость
« Ответ #6 : Апрель 21, 2009, 12:26 »

вот так попробуй
Код
C++ (Qt)
...
QObject::connect(ui->tableWidget, SIGNAL(itemClicked(QTableWidgetItem*)), this, SLOT(check()));
...
 
я вот че-то не понял, из предыдущих постов видно, что сигнатура check
имеет следубщий вид
Цитировать
check(QTableWidgetItem *temp)
почему в коннекте она другая?
Записан
n4ela
Гость
« Ответ #7 : Апрель 21, 2009, 12:37 »

Моя ошибка, надо check(temp)
Код
C++ (Qt)
MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent), ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   ui->tableWidget->setColumnWidth(0,150);
   ui->tableWidget->setRowCount(2);
   QTableWidgetItem *temp = new QTableWidgetItem;
   temp->setCheckState(Qt::Checked);
   ui->tableWidget->setItem(1,1,temp);
   QObject::connect(ui->tableWidget, SIGNAL(itemClicked(QTableWidgetItem*)), this, SLOT(check(temp)));
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
void MainWindow::check(QTableWidgetItem *temp)
{
   if ( temp->checkState() == Qt::Checked )
   QMessageBox::warning(this, QString::fromLocal8Bit("test"), QString::fromLocal8Bit("test"));
}
 
Вот так все компилируется, но почему то не реагируюте на изменение ячейки, такое ощущение что я где то не там connect вызываю.
Записан
spirit
Гость
« Ответ #8 : Апрель 21, 2009, 12:40 »

блин, коннект опять неправельный  Смеющийся
надо так
Код
C++ (Qt)
QObject::connect(ui->tableWidget, SIGNAL(itemClicked(QTableWidgetItem*)), this, SLOT(check(QTableWidgetItem*)));
 
Записан
n4ela
Гость
« Ответ #9 : Апрель 21, 2009, 13:03 »

Понимаю что уже достал. Но connect точно можно вызывать в конструкторе MainWindow
Потому что программа компилируется, но при нажатие по чекбоксу, ничего не происходит. Может в самой функции check что то не дописал? хотя если просто вызвать check то функция выполняется.
Записан
spirit
Гость
« Ответ #10 : Апрель 21, 2009, 13:06 »

гы, забыл сказать, у тебя в ашнике check объявлен простым методом, а не слотом.
исправь вот так
Код
C++ (Qt)
...
private slots:
   void check( QTableWidgetItem * );
...
 
PS. всегда смотри, что в консоли, обычно, если что-то не то с коннектами, то в консоли
будет соответствующая мессага.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #11 : Апрель 21, 2009, 13:09 »

Имхо тут лучше ловить сигнал QTableWidget::itemChanged. При смене состояния чекбокса этот сигнал должен испуститься
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
spirit
Гость
« Ответ #12 : Апрель 21, 2009, 13:10 »

Имхо тут лучше ловить сигнал QTableWidget::itemChanged. При смене состояния чекбокса этот сигнал должен испуститься
ага, 100%.
Записан
n4ela
Гость
« Ответ #13 : Апрель 21, 2009, 13:18 »

Спасибо всем большое, все получилось. Улыбающийся
Записан
Danila_Bagrofff
Гость
« Ответ #14 : Апрель 21, 2009, 15:22 »

а я бы создал кучу chekBox'ов
и сделал: setCellWidget
И спокойно для каждого виджета сделал connect'ы
И никаких проблем.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.265 секунд. Запросов: 23.