Что бы было понятней, прога листает обои рабстола.
В трее висит прога, которую по ПКМ на значке можно развернуть и там будет таблица.
1-й столбец - иконки, 2-й - текст.
Раз в 10 мин, по таймеру, сменяется позиция в таблице. Была к примеру 10, стала 300-я. И соответственно пролистало таблицу до этого элемента.
Все хорошо. Но есть баг.
Если клацнуть по иконке, то смениться положение в таблице в этот же момент, не взирая на таймер.
Вот если так клацнуть, а потом через любое время развернуть из трея, то все иконки от начала, до той строки, на которую сместилось при клике - исчезают. И никак не появляются. Только перезапуск программы.
Бывает и с конца начинает удалять.
Не знаю что приложить. Вот скрин, если нужен код, то какой части, там строк ~400.
http://itmages.ru/image/view/134742/10e62887
модель для таблицы самописанная?
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);
}
Где и как создается и удаляется delicon?
#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;
//...
};
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]);
}
//...
}
//...
Хм.... щас туго соображать, но имхо тут по-любому твой косяк.. Что-то не так делаешь. Попробуй вместо
removeButtons[i]->setIcon(*delicon);
removeButtons[i]->setIcon(QIcon("/usr/share/icons/gnome/48x48/actions/edit-delete.png"));
Не помогло =/
Что значит сигналы, ловяться?
Прогнал через дебаг. Оказывается пропадают не иконки, а сами кнопки.
Нашел причину.
tableWidget->scrollToItem(tableWidget->item(number,1),QAbstractItemView::PositionAtTop);
tableWidget->scrollToItem(tableWidget->item(number,0),QAbstractItemView::PositionAtTop);
ну вот я потрогал QTableWidget, поначалу получил неработающий scrollToItem(), как у тебя, но потом выяснил, что по умолчанию в ячейках таблицы нет никаких итемов, ячейки пусты. Я создал итем (setItem) в ячейке в (0,0), и скролл заработал
QTableWidgetItem* Item = new QTableWidgetItem();
Item->tableWidget()->setCellWidget(i, 0, removeButtons[i]);
я только к тому говорю, что баги нет, если QTableWidgetItem в ячейке есть, scrollToItem отработает. У тебя там виджет, ты и пролетаешь. Может быть, сподручно установить и итем, и виджет в одну ячейку.
QList - уже
На счет checkBox - сделаю. Это же не финальная версия, я пока просто тестю.
>>Может быть, сподручно установить и итем, и виджет в одну ячейку.
Это как? Лэйбл с иконкой и текстом? Но это же тоже виджет. А мне нужна возможность удаления строк. Вот и все.
имею в виду, чтоб подзасунуть в одну ячейку пустой QTableWidgetItem* и туда же твой виджет... если так можно, будет скролить к этой ячейке... но это, в общем, к делу-то не относится - решаем, почему кнопки у тебя убегают. Почему?) кнопки могут убежать, потому что они стёрлись из памяти, другого выхода у них нет
что за цикл в digitClicked()?
>>что за цикл в digitClicked()?
после удаления строки, кнопки теряют порядок (1 2 5 8 и тд.), по этому я их пересоздаю. Другого способа не придумал...
Решением может быть:
1) другой способ вообще, я про удалении строк
2) контекстное меню для QTableWidget, которого нет =(
так ведь ты не удаляешь из removeButtons[i] кнопку, удали и вот тебе порядок
конечно, пересоздавать все кнопки это анархия
зачем передаешь слот:
removeButtons[i] = createButton("Del", SLOT(digitClicked()),i);
соедини сигнал clicked() кнопки и этот слот при создании кнопки
я не понимаю твоё описание, по пунктам опиши действия подробно
и что значит "может быть что-то в духе"?
где код рандомного перехода?
Сам запутался и людей запутал
Решил пойти по пути наименьшего сопротивления.
Сделал QList<QLabel *>, каждому присвоил иконку. Затем их впихнул в 1-й столбец. Сделал обработчик нажатия, ака cellClicked(int,int).
Потом в самом слоте смотрим: если нажато по 1-у столбцу - удаляем строку, если не по первому - ничего не делаем.
Функции нужные выполняет.
Но теперь QLabel пропадает
>>которая половина? какая закономерность?
не ровно половина, но где то посредине, обычно. Я бы сказал что один раз пропадает, к примеру, верхняя, то во второй пропадет нижняя, вот так по переменно. Если долго клацать - пропадают все.
Главное: пропадает только когда свернуто в трей.
Так как сейчас обрабатывается нажатие на таблицу, а не кнопку, то после клика по "пустому месту", где должна быть иконка, снова появляются все иконки.
Обработчик трея.
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;
}
Тут думаю поможет декомпозиция + фикс кармы)
"не ровно половина, но где то посредине, обычно. Я бы сказал что один раз пропадает, к примеру, верхняя, то во второй пропадет нижняя, вот так по переменно. Если долго клацать - пропадают все."
я как на фильм проклятье пришёл в кино)
кстати, QTableWidgetItem можно назначить иконку... зачем там вообще кнопку лепить? кроме как затем чтоб её слот clicked() использовать
кстати, кстати, тебе не нужен QList кнопок, достаточно же просто поместить их в таблицу
QTableWidgetItem* Item = new QTableWidgetItem();
Item->setIcon(icon);
блин, выложи архив проекта, я не могу с этим жить)
Вот, это старый вариант, я уже переписал, что бы работало )
PS: пути к иконкам нужно изменить.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)