Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: SektorCT от Апрель 06, 2015, 21:59



Название: drag'n'drop для QTableWidget и превью обьекта
Отправлено: SektorCT от Апрель 06, 2015, 21:59
Всем добрый вечер.
Напишу заранее, опыта очень мало, по инету гуглил, если бы нашол решение не спрашивал бы совета у комьюнити)
Задача такая, виджет, в моем случаи QTableWidget получает какие то обьекты, в моем случаи это картинки с которыми и будет происходить работа дальнейшая.
То есть на QTableWidget отображается по столбикам название, размер файла и расширение. Само собою этих файлов будет сотнями. Нажимая просто на строку, и она как бы выделяется вся а не только один столбец. На другом виджете уже происходит превью этой картинки, само собою можно увеличивать или уменьшать до начального размера.
Так же если мы на строке где находится нужный нам обьект нажмем мышкой и потащим(drag'n'drop), уже поместим копию этого объекта на другйо виджет где уже будет с этим объектом происходить работа, анимация и так далее. Ниже привожу код, но мне кажется что я не правильным путем пошол из за того что очень плохо знаю QT. Вроде где то пишут и QPixmap и QImage вместо QtableWidget взять а кто то и советует и заменить сразу виджет на QScrollArea(хотя даже представить не могу как он может заменить QTableWidget).
По этому решил сюда написать, с надеждой что кто то поможет с данной задачей. Для меня она далеко не тривиальная.

//Сам лейбед на который будет выводится выбранная картинка
Код
C++ (Qt)
   labelForPreview = new QLabel();
   labelForPreview->setEnabled(false);
   labelForPreview->setAlignment(Qt::AlignCenter);
   labelForPreview->setFrameShape(QFrame::Box);
   labelForPreview->setBackgroundRole(QPalette::Base);
   labelForPreview->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
   labelForPreview->setText("empty");
   labelForPreview->setBackgroundRole(QPalette::Base);
   labelForPreview->setScaledContents(true);
 
//Сам табличный виджет для файлов
Код
C++ (Qt)
   fileTableWidget = new QTableWidget();
   fileTableWidget->setColumnCount(3);
   //fileTableWidget->setHorizontalHeaderLabels(QStringList("Mode"));
   layoutFiles->addWidget(fileTableWidget);
 
//Слоты для загрузки файла и второй для загрузки из таблицы файла на лейбл(с ним сомнения в правильности)
Код
C++ (Qt)
   connect(buttonAdd, SIGNAL(clicked()), this, SLOT(addImages()));
   connect(fileTableWidget, SIGNAL(clicked(QModelIndex)), this, SLOT(imagePreview()));
 
//Ну реализация одного из слотов
Код
C++ (Qt)
void CLibrary::addImages()
{
   files = QFileDialog::getOpenFileNames(this,
                           tr("Open Images"), "",
                           tr("Images (*.png *.xpm *.jpg);;"
                              "All Files (*)"));
   if (!files.isEmpty())
   {
       foreach (QString fileName, files)
       {
           int row = fileTableWidget->rowCount();
           fileTableWidget->setRowCount(row + 1);
 
           QString imageName = QFileInfo(fileName).baseName();
           QString imageSuff = QFileInfo(fileName).suffix();
           int fileSize = QFileInfo(fileName).size();
           QString imageSize;
 
           if(fileSize <= 1024) {
               imageSize = QString("%1 B").arg(fileSize);
           } else
           if(fileSize <= 1024 * 1024) {
               imageSize = QString("%1 kiB").arg(fileSize / 1024);
           } else
           if(fileSize <= 1024 * 1024 * 1024) {
               imageSize = QString("%1 MiB").arg(fileSize / (1024 * 1024));
           }
 
           QTableWidgetItem *item0 = new QTableWidgetItem(imageName);
           QTableWidgetItem *item1 = new QTableWidgetItem(imageSize);
           QTableWidgetItem *item2 = new QTableWidgetItem(imageSuff);
           qDebug() << imageSize;
 
           fileTableWidget->setItem(row, 0, item0);
           fileTableWidget->setItem(row, 1, item1);
           fileTableWidget->setItem(row, 2, item2);
       }
   }
}
 


Название: Re: drag'n'drop для QTableWidget и превью обьекта
Отправлено: sociopath от Апрель 07, 2015, 14:00
Цитировать
Нажимая просто на строку, и она как бы выделяется вся а не только один столбец.
для этого после создания вашего fileTableWidget вызовите
Код:
fileTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);

Цитировать
само собою можно увеличивать или уменьшать до начального размера
само собою это сделать не получится) как именно вы собираетесь увеличивать или уменьшать изображение? по кнопке?
Если вы собираетесь изменять масштаб отображаемой картинки, то вывод в QLabel недостаточен, и тогда нужно использовать что-то типа QGraphicsView (можно, конечно обойтись и QLabel, и использовать функции setPixmap или setPicture, но может и не хватить функционала).

Цитировать
Вроде где то пишут и QPixmap и QImage вместо QtableWidget взять а кто то и советует и заменить сразу виджет на QScrollArea(хотя даже представить не могу как он может заменить QTableWidget).
Выбор QTableWidget для отображения списка верный. Скорее, вам советовали использовать QScrollArea именно для отображения картинки. По поводу отображения картинки написал выше.