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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTabWidget + QAction  (Прочитано 5436 раз)
DenisKh001
Гость
« : Июль 02, 2011, 19:53 »

Динамически создаю несколько вкладок в QTabWidget и есть QAction (скажем операция Copy). Надо установить коннект одного QAction с текущим QTabWiget. Ничего кроме, чем закрытие коннекта и открытие нового при смене вкладки не смог придумать. Есть ли более разумные решения?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #1 : Июль 02, 2011, 20:57 »

в слоте считывать текущий таб (его содержимое) не подходит? может какой-то пример кода приведи, а то больно расплывчатый вопрос.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
popper
Гость
« Ответ #2 : Июль 02, 2011, 22:00 »

Создаешь слот в классе главного виджета, коннектишь его с QAction, а в реализации слота определяешь, какой QTabWidget активен
Записан
DenisKh001
Гость
« Ответ #3 : Июль 03, 2011, 09:56 »

Это выглядит как таблицы (QTableWidget) с вкладками (QTabWidget) как в Exel. Пользователь добавляет и удаляет вкладки. В классе QTableWidget нет предопределенного контексного меню с операциями копирования/вставки и пришлось дописать самому назовем его myQTableWidget. Сначала контексное меню было в главном окне, сейчас написал для myQTableWidget и все заработало почти как надо, т.е. щелкаешь правой кнопкой и копируешь/вставляешь данные в таблицу. Единственная проблема - в главном меню этот номер не проходит, так как каждый раз при смене вкладки надо переустанавливать коннект, а указатели на вкладки нигде не сохраняются. Я наверное, расплывчато объяснил проблему - попробую убрать из кода всякое лишнее и выложить исходник.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #4 : Июль 03, 2011, 12:42 »

завести указатель на myQTableWidget, который будет меняться при изменении вкладки (просто ссылаться на подлежащую таблицу, без выделения памяти) - таким образом, в любой момент времени этот указатель будет указывать на текущую таблицу, вот к нему и приконнектить один раз в самом начале нужный слот.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
DenisKh001
Гость
« Ответ #5 : Июль 03, 2011, 19:14 »

kambala: да, да это то что нужно!
пишу примерно так:
SheetDelivery::SheetDelivery(QWidget *parent)
{
    ...
    myLocalTab = new MyTab;
    connect (ui->TabWid, SIGNAL(currentChanged(int)), this, SLOT(changeTab(int)));
    ...
}

void SheetDelivery::changeTab(int s)
{
    myLocalTab = ui->TabWid->widget(s); // вот здесь конечно ругается на несовместимость типов *Qwidget и *MyTab
}

Как-то надо видимо привести к нужному типу?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #6 : Июль 03, 2011, 19:20 »

в конструкторе не надо выделять память под myLocalTab - это ведь просто указатель на существующую вкладку.

в слоте (конечно при условии, что MyTab является наследником QWidget)
Код
C++ (Qt)
myLocalTab = qobject_cast<MyTab *>(ui->TabWid->widget(s)); // или в скобках ui->TabWid->currentWidget()
if (myLocalTab) // на всякий случай убедимся, что мы таки получили нужный виджет
{
  ...
}
« Последнее редактирование: Июль 03, 2011, 19:21 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
DenisKh001
Гость
« Ответ #7 : Июль 03, 2011, 20:34 »

Еще раз спасибо за дельный и рабочий совет. Почти все сработало, однако пришлось все же каждый раз при смене вкладки создавать коннект заново:
void SheetDelivery::changeTab()
{
    myLocalTab = qobject_cast <MyTab*> (ui->TabWid->currentWidget());
    if (myLocalTab) connect (myLocalTab,SIGNAL(signalName(QString)),this,SLOT(changeTabName(QString)));
    // как-то странно
}

А коннект, который создается в конструкторе класса срабатывает только с последней созданной вкладкой.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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