Russian Qt Forum

Qt => Вопросы новичков => Тема начата: koldun90 от Июнь 20, 2014, 10:07



Название: qtreeview активное окно
Отправлено: koldun90 от Июнь 20, 2014, 10:07
Здравствуйте как отследить текущее активное окно
у меня есть два окна: treeviewи treeview2
так вот как мне отследить какое окно активно при переключении по ним мышкой.
метод isActiveWindow не помогает.
в обоих Тривиевах представлена файловая система, но мне нужно остледить не клик по дереву файловой системы ,а просто переключение между окнами.

Код:
void MainWindow::activazia(int okno)   
{
    if (ui->treeView_2->isActiveWindow())  // ЕУМЙ БЛФЙЧЕО МЕЧЩК ФТЙЧЙЕЧ
    {
        msg.setText(QString::fromLocal8Bit("Активно правое окно"));
        msg.exec();
    }
    if (ui->treeView->isActiveWindow())
    {
        msg.setText(QString::fromLocal8Bit("активно левое окно"));
        msg.exec();
    }

Код:
void MainWindow::pushbutton_clicked()
{
    activazia(0);
}
Вот метод который вызывается при клике на кнопку Button которая на форме
Сначало я активирую левое окно нажимаю кнопку но выполняется условие

Код:
msg.setText(QString::fromLocal8Bit("Активно правое окно"));
msg.exec();

, а должно выполняться условие
Код:
msg.setText(QString::fromLocal8Bit("Активно левое окно"));
msg.exec();

Вообщем почему то всегда у меня активно правое окно почему не знаю


Название: Re: qtreeview активное окно
Отправлено: carrygun от Июнь 20, 2014, 10:18
А hasFocus() пробовали?


Название: Re: qtreeview активное окно
Отправлено: koldun90 от Июнь 20, 2014, 10:25
Код:
hasfocus()
вообще не срабатывает

заместо
Код:
isActiveWindow()
что еще можно попробовать

Еще вопрос а возможно как то treeview вывести модель файловой системы + подключенные сменные носитель( флешки) в linux


те чтоб было вот так
+"/"
+(подключенная флешка(метка тома))

Просто когда отображаешь qfilesystemmodel в windows7 то он отображает изначально как бы подключенные носители
,а если допустим в линуксе то он выводит только каталог "/" (чисто все файловую систему)


Название: Re: qtreeview активное окно
Отправлено: Igors от Июнь 20, 2014, 10:33
isActiveWindow сработает для окна но не виджета внутри. Используйте hasFocus() или viewport().hasFocus() (один из них должен сработать :))


Название: Re: qtreeview активное окно
Отправлено: GreatSnake от Июнь 20, 2014, 10:37
Код
C++ (Qt)
QApplication::focusWidget()->window();


Название: Re: qtreeview активное окно
Отправлено: koldun90 от Июнь 20, 2014, 10:46
Вообщем проблему решил так
Код:
void mytreeview::mousePressEvent(QMouseEvent *event)    //при нажатии пкм
{

    if (event->button() == Qt::RightButton)
    {
       emit sg();
    }
    else
    {
        //при нажатии лкм
        emit activation(1); // мы собственно испускаем сигнал который активирует слот activazia
        QTreeView::mousePressEvent(event);

    }
}

Код:
void MainWindow::activazia(int okno)   
{
    if (ui->treeView_2->hasafocus())  // ЕУМЙ БЛФЙЧЕО МЕЧЩК ФТЙЧЙЕЧ
    {
        msg.setText(QString::fromLocal8Bit("Активно правое окно"));
        msg.exec();
    }
    if (ui->treeView->hasafocus())
    {
        msg.setText(QString::fromLocal8Bit("активно левое окно"));
        msg.exec();
    }
поэтому собственно глюк был втом метод activazia запусклся по нажатию на кнопку а я просто переопределил mousePressEvent и вроде hasfocus корректно работает при нажатии на левый тривиев и на правый тривиев


Название: Re: qtreeview активное окно
Отправлено: koldun90 от Июнь 20, 2014, 10:52
А по поводу второго вопроса можете помочь как отобразить файловую систему не толmrj корень "/"
а еще и подключены съемные носители подскажите в какую сторону нужно копать ? что переопределять и тд? Чтоб файловую ситему отображало примерно как в винде


Название: Re: qtreeview активное окно
Отправлено: Igors от Июнь 20, 2014, 11:04
Зависит от того что за "окно" имеется ввиду. Если это само QTreeWidget - то hasFocus, если "то окно в котором QTreeWidget то window()->isActivеWindow(). И неясно зачем это искать - если Вы получили mousePressEvent то фокус на нем уже и стоит и его окно активно. И "активазия" может случиться не только по мыше, поэтому лучше перекрывать focusInEvent/focusOutEvent