Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Пропадают иконки в таблице.
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt GUI
RazrFalcon
Что бы было понятней, прога листает обои рабстола.
В трее висит прога, которую по ПКМ на значке можно развернуть и там будет таблица.
1-й столбец - иконки, 2-й - текст.
Раз в 10 мин, по таймеру, сменяется позиция в таблице. Была к примеру 10, стала 300-я. И соответственно пролистало таблицу до этого элемента.
Все хорошо. Но есть баг.
Если клацнуть по иконке, то смениться положение в таблице в этот же момент, не взирая на таймер.
Вот если так клацнуть, а потом через любое время развернуть из трея, то все иконки от начала, до той строки, на которую сместилось при клике - исчезают. И никак не появляются. Только перезапуск программы.
Бывает и с конца начинает удалять.
Не знаю что приложить. Вот скрин, если нужен код, то какой части, там строк ~400.
Litkevich Yuriy
модель для таблицы самописанная?
RazrFalcon
    for(int i=0; i<allFiles.count(); i++)
    {
        removeButtons[i] = createButton("Del", SLOT(digitClicked()),i);
        removeButtons[i]->setIcon(*delicon);
        removeButtons[i]->setAutoRaise(true);
        removeButtons[i]->setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
        removeButtons[i]->setGeometry(0,0,30,30);
        tableWidget->setCellWidget(i, 0, removeButtons[i]);

        QTableWidgetItem* Item = new QTableWidgetItem();
        if (onlynames_checkBox->checkState()==Qt::Checked)
            Item->setText(QString(allFiles.at(i).fileName()));
        if (onlynames_checkBox->checkState()==Qt::Unchecked)
            Item->setText(QString(allFiles.at(i).absoluteFilePath()));
        tableWidget->setItem(i, 1, Item);
    }

Забыл сказать, что иконки пропадают на кнопках, созданных с помощью QToolButton.
Rocky
Где и как создается и удаляется delicon?
RazrFalcon
.h
#include <QToolButton>

//...

class Button : public QToolButton
{
    Q_OBJECT

public:
    Button(const QString &text, QWidget *parent = 0);
};

//...

class WallWindow : public QDialog
{
    Q_OBJECT

//...

private:
    Button *createButton(const QString &text, const char *member, int &num);
    enum { NumDigitButtons = 1000 };
    Button *removeButtons[NumDigitButtons];
        QIcon *trayicon, *delicon;

//...
};
.cpp
WallWindow::WallWindow()
{

//...

    delicon = new QIcon("/usr/share/icons/gnome/48x48/actions/edit-delete.png");

//...

}

//...

Button::Button(const QString &text, QWidget *parent):QToolButton(parent){setText(text);}

void WallWindow::digitClicked()
{
    Button *clickedButton = qobject_cast<Button *>(sender());
    int nowClicked=clickedButton->accessibleName().toInt();

    allFiles.removeAt(nowClicked);
    tableWidget->removeRow(nowClicked);

    for(int i=0; i<allFiles.count(); i++)
    {
        removeButtons[i] = createButton("Del", SLOT(digitClicked()),i);
        removeButtons[i]->setIcon(*delicon);
        removeButtons[i]->setAutoRaise(true);
        tableWidget->setCellWidget(i, 0, removeButtons[i]);
    }

//...

}

//...


digitClicked() - это когда я удаляю строку в таблице, это не влияет в общем на пропадание иконок.
Rocky
Хм.... щас туго соображать, но имхо тут по-любому твой косяк.. Что-то не так делаешь. Попробуй вместо
removeButtons[i]->setIcon(*delicon);

поставить
removeButtons[i]->setIcon(QIcon("/usr/share/icons/gnome/48x48/actions/edit-delete.png"));

может поможет конечно, но не факт... И еще, с tableWidget какие-нить сигналы ловятся?
RazrFalcon
Не помогло =/
Что значит сигналы, ловяться?

Прогнал через дебаг. Оказывается пропадают не иконки, а сами кнопки.
RazrFalcon
Нашел причину.
tableWidget->scrollToItem(tableWidget->item(number,1),QAbstractItemView::PositionAtTop);

Если закоментить - то все нормально работает, но не листает конечно. <_<
PS: если выбрать столбец 0, то есть:
tableWidget->scrollToItem(tableWidget->item(number,0),QAbstractItemView::PositionAtTop);

то вообще не листает =/ Бага.
abc
ну вот я потрогал QTableWidget, поначалу получил неработающий scrollToItem(), как у тебя, но потом выяснил, что по умолчанию в ячейках таблицы нет никаких итемов, ячейки пусты. Я создал итем (setItem) в ячейке в (0,0), и скролл заработал
RazrFalcon
Цитата(abc @ 17.3.2011, 15:51) *
по умолчанию в ячейках таблицы нет никаких итемов, ячейки пусты.

По умолчанию - да, но я то уже их заполнил, как на рисунке выше. Только у меня в первом столбце не items, а Widget's ...
Суть в том, что виджеты, эти, пропадают при скроле по итемам во втором столбце, вот так вот.

Такой трюк не прошел:
QTableWidgetItem* Item = new QTableWidgetItem();
Item->tableWidget()->setCellWidget(i, 0, removeButtons[i]);
abc
я только к тому говорю, что баги нет, если QTableWidgetItem в ячейке есть, scrollToItem отработает. У тебя там виджет, ты и пролетаешь. Может быть, сподручно установить и итем, и виджет в одну ячейку.

Цитата(RazrFalcon @ 17.3.2011, 18:08) *
QTableWidgetItem* Item = new QTableWidgetItem();
Item->tableWidget()->setCellWidget(i, 0, removeButtons[i]);


в данном коде итем не принадлежит никакой таблице, а ты требуешь у него указатель на неё. что он может тебе предложить?

Зачем наследовал QToolButton?

Цитата(RazrFalcon @ 26.2.2011, 15:49) *
enum { NumDigitButtons = 1000 };
Button *removeButtons[NumDigitButtons];

Зачем enum? зачем массив, а не какой-нибудь контейнер, типа QList?

Цитата(RazrFalcon @ 25.2.2011, 21:04) *
if (onlynames_checkBox->checkState()==Qt::Checked)
Item->setText(QString(allFiles.at(i).fileName()));
if (onlynames_checkBox->checkState()==Qt::Unchecked)
Item->setText(QString(allFiles.at(i).absoluteFilePath()));

второй if меняешь на else, и код становится короче и понятнее
плюс у чекбокса есть метод isChecked()
RazrFalcon
QList - уже :lol:
На счет checkBox - сделаю. Это же не финальная версия, я пока просто тестю.

>>Может быть, сподручно установить и итем, и виджет в одну ячейку.
Это как? Лэйбл с иконкой и текстом? Но это же тоже виджет. А мне нужна возможность удаления строк. Вот и все.
abc
имею в виду, чтоб подзасунуть в одну ячейку пустой QTableWidgetItem* и туда же твой виджет... если так можно, будет скролить к этой ячейке... но это, в общем, к делу-то не относится - решаем, почему кнопки у тебя убегают. Почему?) кнопки могут убежать, потому что они стёрлись из памяти, другого выхода у них нет

что за цикл в digitClicked()?
RazrFalcon
>>что за цикл в digitClicked()?
после удаления строки, кнопки теряют порядок (1 2 5 8 и тд.), по этому я их пересоздаю. Другого способа не придумал...

Решением может быть:
1) другой способ вообще, я про удалении строк
2) контекстное меню для QTableWidget, которого нет =(
abc
так ведь ты не удаляешь из removeButtons[i] кнопку, удали и вот тебе порядок
конечно, пересоздавать все кнопки это анархия

зачем передаешь слот:
removeButtons[i] = createButton("Del", SLOT(digitClicked()),i);
соедини сигнал clicked() кнопки и этот слот при создании кнопки
RazrFalcon
Цитата(abc @ 17.3.2011, 20:50) *
так ведь ты не удаляешь из removeButtons[i] кнопку, удали и вот тебе порядок
конечно, пересоздавать все кнопки это анархия

Понял, ступил. Поправил.
Но проблема то зарыта в трее, если так листать, то все норм, а вот если свернуть прогу в трей и нажимать по иконке, по нажатию переходит на следующую строку, рэндомную, то происходит это исчезание.

А еще может быть что то в духе:
abc
я не понимаю твоё описание, по пунктам опиши действия подробно

и что значит "может быть что-то в духе"?

где код рандомного перехода?
RazrFalcon
Цитата(abc @ 17.3.2011, 21:14) *
я не понимаю твоё описание, по пунктам опиши действия подробно

1) Программа заполняет таблицу списком изображений. Запускается свернутой в трей.
2) По нажатии на иконке в трее происходит переход на следующую строку в таблице.
3) Разворачиваем из трея и видим то, что половина кнопок пропала.

Если не сворачивать в трей и нажимать по иконке в трее - тоже будет листать таблицу, но иконки пропадать не будут. Листает в перемешку, а не последовательно.


Цитата(abc @ 17.3.2011, 21:14) *
и что значит "может быть что-то в духе"?
Имеется в виду, что то что на скриншоте показано - случается иногда, из-за того что в первой колонке кнопки.
abc
Цитата(RazrFalcon @ 17.3.2011, 22:28) *
По нажатии на иконке в трее происходит переход на следующую строку в таблице.


Цитата(RazrFalcon @ 17.3.2011, 22:28) *
Листает в перемешку, а не последовательно.


так по какому закону листает-то? рандом? код дай

Цитата(RazrFalcon @ 17.3.2011, 22:28) *
Разворачиваем из трея и видим то, что половина кнопок пропала.

которая половина? какая закономерность?

про скриншот всё равно не понял.. я же не знаю чем "обычно" отличается от "иногда".. какое поведение нормальное, а какое на скриншоте
RazrFalcon
Сам запутался и людей запутал :lol:
Решил пойти по пути наименьшего сопротивления.
Сделал QList<QLabel *>, каждому присвоил иконку. Затем их впихнул в 1-й столбец. Сделал обработчик нажатия, ака cellClicked(int,int).
Потом в самом слоте смотрим: если нажато по 1-у столбцу - удаляем строку, если не по первому - ничего не делаем.
Функции нужные выполняет.
Но теперь QLabel пропадает :blink:

>>которая половина? какая закономерность?
не ровно половина, но где то посредине, обычно. Я бы сказал что один раз пропадает, к примеру, верхняя, то во второй пропадет нижняя, вот так по переменно. Если долго клацать - пропадают все.
Главное: пропадает только когда свернуто в трей.

Так как сейчас обрабатывается нажатие на таблицу, а не кнопку, то после клика по "пустому месту", где должна быть иконка, снова появляются все иконки.

Обработчик трея.
Раскрывающийся текст
void WallWindow::iconActivated(QSystemTrayIcon::ActivationReason reason)
{
    if (reason==3 || reason==2)
        set_image();
}

int WallWindow::set_image()
{
    if (row_num!=0)
    {
        number=row_num;
        order_comboBox_currentIndexChanged("Linear");
    }
    else number=rand_numbers.first();

    if (order_comboBox->currentText()=="Linear" && row_num==0)
    {
        number=linear_list.first();
        qDebug()<<"Set image:"<<allFiles.at(number).absoluteFilePath();
        processStart("/desktop/gnome/background/picture_filename",
                     allFiles.at(number).absoluteFilePath());
        linear_list.removeFirst();
    }
    else
    {
        qDebug()<<"Set image:"<<allFiles.at(number).absoluteFilePath();
        processStart("/desktop/gnome/background/picture_filename",
                     allFiles.at(number).absoluteFilePath());
        if (row_num==0) rand_numbers.removeFirst();
    }

    tableWidget->scrollToItem(tableWidget->item(number,1),QAbstractItemView::PositionAtTop);
    tableWidget->horizontalScrollBar()->setValue(0);
    trayIcon->setToolTip("Now: "+allFiles.at(number).fileName());
    if (rand_numbers.count()==0) rand_numbers=create_randlist();
    if (linear_list.count()==0) create_randlist();

    row_num=0;
    return 0;
}
Rocky
Тут думаю поможет декомпозиция + фикс кармы)
abc
Цитата(RazrFalcon @ 17.3.2011, 22:50) *
Сделал QList<QLabel *>, каждому присвоил иконку. Затем их впихнул в 1-й столбец. Сделал обработчик нажатия, ака cellClicked(int,int).

а разве нельзя
QList<QToolButton *> или пушбаттон
и соединить их clicked() с твоим слотом
не надо будет проверять, какой столбец

по поводу остального: боже мой


"Тут думаю поможет декомпозиция + фикс кармы) " ыыыы)

рассуй комментрии в set_image()
и это покажи: create_randlist()

хотя я уже потерял всякую нить, где-то клацаем, что-то пропадает, что-то не пропадает... наверняка есть закономерность, найди её!

RazrFalcon
Цитата(abc @ 17.3.2011, 21:54) *
по поводу остального: боже мой

Что именно?
abc
"не ровно половина, но где то посредине, обычно. Я бы сказал что один раз пропадает, к примеру, верхняя, то во второй пропадет нижняя, вот так по переменно. Если долго клацать - пропадают все."

я как на фильм проклятье пришёл в кино)


кстати, QTableWidgetItem можно назначить иконку... зачем там вообще кнопку лепить? кроме как затем чтоб её слот clicked() использовать

кстати, кстати, тебе не нужен QList кнопок, достаточно же просто поместить их в таблицу
RazrFalcon
QTableWidgetItem* Item = new QTableWidgetItem();
Item->setIcon(icon);

Проблема решена.
Как не пытался, любой widget пропадает из-за скрола.
abc
блин, выложи архив проекта, я не могу с этим жить)
RazrFalcon
Вот, это старый вариант, я уже переписал, что бы работало )

PS: пути к иконкам нужно изменить.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.