Russian Qt Forum

Qt => Базы данных => Тема начата: almareta от Сентябрь 10, 2010, 10:12



Название: копировать в буфер
Отправлено: almareta от Сентябрь 10, 2010, 10:12
Имеется таблица из БД, выведена в форму.
Нужно реализовать следующее:
Выделяешь строку нужную, нажимаешь на кнопку(или f2), строка копируется в буфер обмена.
Для удобства есть вылезающая форма, она указывает на то, что строка скопирована...или впринципе и без этого можно обойтись, просто отобразив в статус баре то же самое("строка скопирована").
Мысли и идеи приветствуются, возможно уже есть какие-то решения, на форуме не нашла.Заранее спасибо


Название: Re: копировать в буфер
Отправлено: Sancho_s_rancho от Сентябрь 10, 2010, 10:35
Имеется таблица из БД, выведена в форму.
Нужно реализовать следующее:
Выделяешь строку нужную, нажимаешь на кнопку(или f2), строка копируется в буфер обмена.
Для удобства есть вылезающая форма, она указывает на то, что строка скопирована...или впринципе и без этого можно обойтись, просто отобразив в статус баре то же самое("строка скопирована").
Мысли и идеи приветствуются, возможно уже есть какие-то решения, на форуме не нашла.Заранее спасибо
А что не так с QClipboard?


Название: Re: копировать в буфер
Отправлено: almareta от Сентябрь 10, 2010, 10:56
на него нашла только пример
Код:
#include <qapplication.h>
#include <qclipboard.h>

int main( int argc, char **argv )
{
    QApplication a( argc, argv );
    qDebug(QApplication::clipboard()->text());
    QApplication::clipboard()->setText("aaa");
    return 0;
}

только без описания


Название: Re: копировать в буфер
Отправлено: noirhor от Сентябрь 10, 2010, 16:54
QApplication::clipboard()->text();
QApplication::clipboard()->setText("aaa");

Ну вот.  Первое возвращает текст из буфера, второе заносит в буфер.
Создаете слот, например:
Код:
public slots:
    void slotClipText()
    {
        QString str = <Ваша строка>;
        QApplication::clipboard()->setText(str);
        statusBar()->addWidget(new QLabel("Строка скопирована"));
    }


Потом коннектимся:
Код:
<Ваша кнопка> -> setShortcut(Qt::Key_F2);
connect(<Ваша кнопка>, SIGNAL(clicked()), SLOT(slotClipText()));

или без кнопки:
Код:
QAction *action = new QAction(0);
action->setShortcut(Qt::Key_F2);
<Ваш виджет> -> addAction(action);
connect(action, SIGNAL(triggered()), SLOT(slotClipText()));


Название: Re: копировать в буфер
Отправлено: almareta от Сентябрь 13, 2010, 08:14
Спасибо буду пробовать, но чувствую вопросов будет много ))


Название: Re: копировать в буфер
Отправлено: almareta от Сентябрь 13, 2010, 08:22
Цитировать
QString str = <Ваша строка>;

как определить, что строка выделена?


Название: Re: копировать в буфер
Отправлено: Karl-Philipp от Сентябрь 13, 2010, 08:38
Цитировать
QString str = <Ваша строка>;

как определить, что строка выделена?
Похоже, что вам нужен QLineEdit. :)


Название: Re: копировать в буфер
Отправлено: almareta от Сентябрь 13, 2010, 08:47
Цитировать
QString str = <Ваша строка>;

как определить, что строка выделена?
Похоже, что вам нужен QLineEdit. :)

можно спросить, для каких целей, что я буду там отображать? )


Название: Re: копировать в буфер
Отправлено: Karl-Philipp от Сентябрь 13, 2010, 09:31
Цитировать
QString str = <Ваша строка>;

как определить, что строка выделена?
Похоже, что вам нужен QLineEdit. :)

можно спросить, для каких целей, что я буду там отображать? )
Что вы подразумеваете под "как определить, что строка выделена?"? :)


Название: Re: копировать в буфер
Отправлено: almareta от Сентябрь 13, 2010, 09:38
Цитировать
QString str = <Ваша строка>

<Ваша строчка> сюда как я понимаю надо записывать выделенную строку моей таблицы, так как программа будет определять выделена строка или нет?


Название: Re: копировать в буфер
Отправлено: Karl-Philipp от Сентябрь 13, 2010, 10:12
Цитировать
QString str = <Ваша строка>

<Ваша строчка> сюда как я понимаю надо записывать выделенную строку моей таблицы, так как программа будет определять выделена строка или нет?

1) получаем текущий индекс:
Цитировать
QModelIndex QAbstractItemView::currentIndex () const
2) узнаем номер строчки:
Цитировать
int QModelIndex::row () const


Название: Re: копировать в буфер
Отправлено: almareta от Сентябрь 13, 2010, 10:41
мне вот даже интересно, как это собрать воедино ))
Код:
 
QStatusBar *statusBar = new QStatusBar(); // создала статусбар
int QModelIndex::row() const //узнала номер строки
QString str = ?
QApplication::clipboard()->setText(str); //занесли в буфер
statusBar->addWidget(new QLabel("Строка скопирована")); //строка состояние

так я понимаю?


Название: Re: копировать в буфер
Отправлено: Kolobok от Сентябрь 13, 2010, 11:10
Код:
QModelIndex current = view->currentIndex();
if( index.isValid() )
{
  QString str = index.data();
  QApplication::clipboard()->setText( str );
  statusBar()->showMessage( str );
}

Каждый раз создавать QStatusBar не нужно. И желательно прочитать раздел Model/View programming.


Название: Re: копировать в буфер
Отправлено: almareta от Сентябрь 13, 2010, 12:05
Код:
QModelIndex current = view->currentIndex();
if( index.isValid() )
{
  QString str = index.data();
  QApplication::clipboard()->setText( str );
  statusBar()->showMessage( str );
}

Каждый раз создавать QStatusBar не нужно. И желательно прочитать раздел Model/View programming.

...но на него он ругается и не только на него...

/home/gorans/QTProjects/bankcards_10_09/task_filter.cpp:13: error: ‘view’ was not declared in this scope
/home/gorans/QTProjects/bankcards_10_09/task_filter.cpp:14: error: ‘index’ does not have class type
/home/gorans/QTProjects/bankcards_10_09/task_filter.cpp:16: error: ‘index’ does not have class type
/home/gorans/QTProjects/bankcards_10_09/task_filter.cpp:18: error: ‘statusBar’ was not declared in this scope
/home/gorans/QTProjects/bankcards_10_09/task_filter.cpp:13: warning: unused variable ‘current’


Название: Re: копировать в буфер
Отправлено: almareta от Сентябрь 13, 2010, 12:30
И можно ссылку на Model/View programming пожалуйста...


Название: Re: копировать в буфер
Отправлено: merke от Сентябрь 13, 2010, 12:59
Инклуды:

#include <QModelIndex>
#include <QStatusBar>

/home/gorans/QTProjects/bankcards_10_09/task_filter.cpp:13: error: ‘view’ was not declared in this scope

Это Ваш виджет-таблица, он у Вас может иначе называться!!!

/home/gorans/QTProjects/bankcards_10_09/task_filter.cpp:14: error: ‘index’ does not have class type
/home/gorans/QTProjects/bankcards_10_09/task_filter.cpp:16: error: ‘index’ does not have class type

Вместо index.data() воткните current.data()

/home/gorans/QTProjects/bankcards_10_09/task_filter.cpp:13: warning: unused variable ‘current’

Вместо index.data() воткните current.data()

Соединяем воедино:

Код:
QAction *action = new QAction(0);
action->setShortcut(Qt::Key_F2);
<Ваш виджет> ->addAction(action);
connect(action, SIGNAL(triggered()), SLOT(slotClipText()));

void КЛАСС::slotClipText()
{
  QModelIndex current = view->currentIndex();
  if( index.isValid() )
   {
     QString str = current.data();
     QApplication::clipboard()->setText( str );
     statusBar()->showMessage( str );
   } 
}


Название: Re: копировать в буфер
Отправлено: merke от Сентябрь 13, 2010, 13:00
http://doc.qt.nokia.com/4.3/model-view-programming.html


Название: Re: копировать в буфер
Отправлено: almareta от Сентябрь 13, 2010, 14:26
Дело в том, что переделывать чужой код крайне сложно...буду пытаться


Название: Re: копировать в буфер
Отправлено: merke от Сентябрь 13, 2010, 14:40
Пардон за флуд!!! Alma Asenova это Вы?


Название: Re: копировать в буфер
Отправлено: Kolobok от Сентябрь 13, 2010, 14:56
Опечатался, sorry.

Код:
QModelIndex current = view->currentIndex();
if( current.isValid() )
{
  QString str = current.data();
  QApplication::clipboard()->setText( str );
  statusBar()->showMessage( str );
}

statusBar() принадлежит обьекту QMainWindow. Обычно это главное окно приложения.


Название: Re: копировать в буфер
Отправлено: almareta от Сентябрь 13, 2010, 15:13
Александр, нет не я.