Скроллинг в Firefox средней кнопкой мыши


Firefox по нажатию средней кнопки мыши по умолчанию открывает новую вкладку с адресом, которую вы предварительно выделили.
А если не выделили, то говорит, что не может открыть такой адрес.

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

Google без труда отыскал мне решение:

В настройках Firefox’а (вводим в адресную строку about:config) меняем значения параметров:

middlemouse.contentLoadURL на false
general.autoScroll на true

Перезапускаем браузер и радуемся.

Сборник статей «Программирование с Qt»


Сборник, на данный момент состоящий из 4 статей, публикуется Алексеем Бешеновым на www.ibm.com.

  1. Программирование с Qt : Часть 1. Введение. Инструменты разработчика и объектная модель.
  2. Программирование с Qt : Часть 2. Типы, варианты, ссылки и разделение данных.
  3. Программирование с Qt : Часть 3. Контейнеры.
  4. Программирование с Qt : Часть 4. Алгоритмы. Флаги и биты.

Алексей Бешенов — независимый разработчик и технический писатель, работающий со свободным программным обеспечением и свободными технологиями. Интересуется функциональным и логическим программированием, занимается математикой и теоретической информатикой.

Дополнение к «Реализация простого логгера на Qt»


Усовершенствовал пример логгера для вывода информации в таблицу QTableView.
В проект включается модель QStandardItemModel, которая заполняется в функции customMessageHandler.
Можно поэкспериментировать с очисткой истории логов.


static QStandardItemModel* logModel = new QStandardItemModel(0, 2);

Немного изменяется функция customMessageHandler:


void customMessageHandler(QtMsgType type, const char* msg)
{
std::cout << msgType[type] << msg << std::endl;
if(logStream && logStream->device())
{
*logStream << msgType[type] << msg << endl;
}
logModel->insertRow(0, QList() << new QStandardItem(msgType[type]) << new QStandardItem(msg));


// Очистка лога
if (logModel->rowCount() > 1000)
logModel->removeRows(900, logModel->rowCount() - 99);
}

Дальше установим модель таблице и настроим ее внешний вид, например так:


int main(int argc, char *argv[])
{
...
logModel->setHorizontalHeaderLabels(QStringList() << "Type" << "Message");
MainWindow w;
// Установка модели w.logTableView
setModel(logModel);
// Настройка внешнего облика
w.logTableView->setAlternatingRowColors(true);
w.logTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
w.logTableView->setGridStyle(Qt::NoPen);
w.logTableView->verticalHeader()->hide();
w.logTableView->horizontalHeader()->setStretchLastSection(true);
w.logTableView->resizeRowsToContents();
w.logTableView->setWordWrap(false);
w.show();
int mainReturn = a.exec();
...
}

Результат:
Результат

P.S. Как вариант можно использовать QStringListModel и выводить в QListView.

QTableWidget — Редактирование набора ячеек


Как изменить значение сразу нескольких ячеек в QTableWidget?

Решение:


connect(myTableWidget,  SIGNAL(itemChanged(QTableWidgetItem*)), this,  SLOT(myItemChanged(QTableWidgetItem*)));

// Check value of item  & edit it properly
void MainWindow::checkMyItem(QTableWidgetItem *  item)
{
	//...
}

void  MainWindow::myItemChanged(QTableWidgetItem* item)
{
	// Check  edited element
	checkMyItem(item);

	QList  selectedItems = parametersTableWidget->selectedItems();
	if  (!selectedItems.isEmpty())
	{
	foreach (QTableWidgetItem*  selectItem, selectedItems)
	{
		selectItem->setText(item->text());
		if  (selectItem != item)
			checkMyItem(selectItem);
		}
	}
}

Подсчет свободного места на диске


Искал способ подсчета свободного места на диске.
Нашел тут
Приведу код, работающий под Windows и Linux.
Функция возвращает размер доступного пространства на диске в Килобайтах.


#ifdef _WIN32
	#include 
#else // Linux
	#include 
	#include 
#endif // _WIN32

bool MainWindow::getFreeTotalSpace(const QString& sDirPath, double& fTotal, double& fFree)
{
	double fKB = 1024;
	#ifdef _WIN32

		QString sCurDir = QDir::current().absolutePath();
		QDir::setCurrent(sDirPath);

		ULARGE_INTEGER free,total;
		bool bRes = ::GetDiskFreeSpaceExA( 0 , &free , &total , NULL );
		if ( !bRes ) return false;

		QDir::setCurrent( sCurDir );

		fFree = static_cast( static_cast<__int64>(free.QuadPart) ) / fKB;
		fTotal = static_cast( static_cast<__int64>(total.QuadPart) ) / fKB;

	#else // Linux

		struct stat stst;
		struct statfs stfs;

		if ( ::stat(sDirPath.local8Bit(),&stst) == -1 ) return false;
		if ( ::statfs(sDirPath.local8Bit(),&stfs) == -1 ) return false;

		fFree = stfs.f_bavail * ( stst.st_blksize / fKB );
		fTotal = stfs.f_blocks * ( stst.st_blksize / fKB );

	#endif // _WIN32

	return true;
}

Fedora 13: Что нового?


Fedora 13 — дистрибутив операционной системы Linux. Развитие дистрибутива спонсируется фирмой Red Hat и поддерживается сообществом.
Релиз 13й версии с кодовым именем Goddard намечен на 11 мая.

Основные особенности версии:

  • Ядро 2.6.33
  • Рабочая среда: KDE 4.4, Moblin 2.2, Gnome 2.30, XFCE 4.8, Sugar 0.88
  • Автоматическая установка драйверов принтеров при подключении (gutenprint-cups, hpijs и pbm2l2030)
  • Улучшенная поддержка web-камер (в частности, поддержка dual-mode камер)
  • GNOME Color Manager, позволяет создавать цветовые профили в GNOME и легко управлять ими
  • Улучшения в отладчике dbg совместно с Python 3 и 2
  • Среда разработки IntelliJ IDEA добавлена в репозиторий
  • По умолчанию NFSv4 с поддержкой IPv6
  • Улучшения поддержки виртуализации
  • Расширенная поддержка DisplayPort в драйверах Radeon и nouveau
  • Обновление RPM до версии 4.8
  • Интеграция SIP Witch Domain Telephony в среду
  • Обновление Upstart 0.6.0
  • Среда разработки обновилась NetBeans 6.8
  • Улучшения в диалоге «Обо мне»
  • Добавлен плагин к yum, устанавливающий перевод программы на ваш родной язык

Полный список улучшений

Реализация простого логгера на Qt


Практически для любого приложения необходима функция ведения логов.
Приведу пример, который использую в небольших проектах.
Конечно, для серьезных решений желательно пользоваться syslog или его альтернативами, дополнительными библиотеками типа log4qt.

Данный пример ведет лог в файл и консоль.

main.cpp:


// Данные для ведения логов
static QTextStream* logStream;
static QFile* logFile;

// Типы сообщений
static const char* msgType[] =
{
"(II) ", // Info
"(WW) ", // Warning
"(EE) ", // Error
"(FF) " // Fatal error
};

const QString TextDescription = QObject::tr(
"%1 %2\n"
"Built on " __DATE__ " at " __TIME__ ".\n"
"Based on Qt %3.\n"
"Copyright %4. All rights reserved.\n"
"See also %5\n")
.arg(QLatin1String(APP_NAME), QLatin1String(APP_VERSION),
QLatin1String(QT_VERSION_STR), QLatin1String(ORG_NAME), QLatin1String(ORG_DOMAIN)
);

// Вывод логов в файл
void customMessageHandler(QtMsgType type, const char* msg);
// Создание файла для логов
void installLog();
// Закрытие файла логов
void finishLog();
// Информация об ОС
QString getOSInfo();

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

// Под Windows устанавливаем кодировку cp1251
#ifdef Q_WS_WIN
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
// Под остальными ОС - utf8
#else
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
#endif

installLog();

MainWindow w;
w.show();

int mainReturn = a.exec();

finishLog();
return mainReturn;
}

void customMessageHandler(QtMsgType type, const char* msg)
{
std::cout << msgType[type] << msg << std::endl;
if(logStream && logStream->device())
{
*logStream << msgType[type] << msg << endl;
}
}

void installLog()
{
logFile = new QFile("messages.log");
if(logFile->open(QFile::WriteOnly | QIODevice::Append | QIODevice::Unbuffered))
logStream = new QTextStream(logFile);

#ifdef Q_WS_WIN
logStream->setCodec("Windows-1251");
// Под остальными ОС - utf8
#else
logStream->setCodec("utf-8");
#endif

// Запись заголовка с информацией о запуске
if(logStream && logStream->device())
{
*logStream << endl << TextDescription << endl;
*logStream << QString("Markers: (II) informational, (WW) warning,") << endl;
*logStream << QString("(EE) error, (FF) fatal error.") << endl;
*logStream << getOSInfo() << endl;
*logStream << QString("Runned at %1.").arg(QDateTime::currentDateTime().toString()) << endl << endl;
}

qInstallMsgHandler(customMessageHandler);

qDebug("Success opening log file");
}

void finishLog()
{
qDebug("Success closing log file");

delete logStream;
logStream = 0;
delete logFile;
logFile = 0;

qInstallMsgHandler(0);
}

QString getOSInfo()
{
QString infoStr("Current Operating System: %1");
#ifdef Q_OS_WIN
switch(QSysInfo::windowsVersion())
{
case QSysInfo::WV_NT: return infoStr.arg("Windows NT");
case QSysInfo::WV_2000: return infoStr.arg("Windows 2000");
case QSysInfo::WV_XP: return infoStr.arg("Windows XP");
case QSysInfo::WV_2003: return infoStr.arg("Windows 2003");
case QSysInfo::WV_VISTA: return infoStr.arg("Windows Vista");
case QSysInfo::WV_WINDOWS7: return infoStr.arg("Windows Seven");
default: return infoStr.arg("Windows");
}
#endif // Q_OS_WIN

#ifdef Q_OS_MAC
switch(QSysInfo::MacintoshVersion())
{
case QSysInfo::MV_CHEETAH: return infoStr.arg("Mac OS X 1.0 Cheetah");
case QSysInfo::MV_PUMA: return infoStr.arg("Mac OS X 1.1 Puma");
case QSysInfo::MV_JAGUAR: return infoStr.arg("Mac OS X 1.2 Jaguar");
case QSysInfo::MV_PANTHER: return infoStr.arg("Mac OS X 1.3 Panther");
case QSysInfo::MV_TIGER: return infoStr.arg("Mac OS X 1.4 Tiger");
case QSysInfo::MV_LEOPARD: return infoStr.arg("Mac OS X 1.5 Leopard");
case QSysInfo::MV_SNOWLEOPARD: return infoStr.arg("Mac OS X 1.6 Snow Leopard");
default: return infoStr.arg("Mac OS X");
}
#endif // Q_OS_MAC

#ifdef Q_OS_LINUX
#ifdef LINUX_OS_VERSION
return infoStr.arg(LINUX_OS_VERSION);
#else
return infoStr.arg("Linux");
#endif // LINUX_OS_VERSION
#endif // Q_OS_LINUX
}


Использование:


qDebug(...);
qWarning(...);
qCritical(...);

Пример вывода логгера:


MyApplication 0.0.2
Built on Jan 12 2010 at 13:29:24.
Based on Qt 4.6.0.
Copyright My Company. All rights reserved.
See also http://www.mycompany.ru

Markers: (II) informational, (WW) warning,
(EE) error, (FF) fatal error.
Current Operating System: Windows XP
Runned at Чт 14. янв 10:52:08 2010.

(II) Success opening log file
(II) Reading application settings...
(II) Application settings read and applied.
(WW) Object::connect: No such slot QDragTreeView::customContextMenuRequestedHandler(QPoint) in QDragTreeView.cpp:15
(II) Loaded logDockWidget.
(II) Loaded consoleDockWidget.
(II) Finding plugins
(II) Default configuration of Instrument_1 successfully read.
(II) Default configuration of Module_1 successfully read.
(II) Default configuration of Module_2 successfully read.
(II) Default configuration of Module_3 successfully read.
(II) Default configuration of Module_4 successfully read.
(II) Instrument plugins Instrument_1 found.
(II) Module plugins Module_1 found.
(II) Module plugins Module_2 found.
(II) Module plugins Module_3 found.
(II) Module plugins Module_4 found.
(II) Success closing log file

Отслеживать

Get every new post delivered to your Inbox.