28 июня 2012 г.

Пример использования QDataWidgetMapper в PySide

В одном из постов данного блога был пост на тему использования Базы Данных из PySide. Теперь постараемся расширить тот скрипт и приделать к полям таблицы редактируемые элементы управления.
Для этого нам понадобится класс QDataWidgetMapper. Этот класс реализует связь между моделью таблицы и элементами управления.
Сначала нужно будет создать объект QDataWidgetMapper. Связать его с моделью использую функцию setModel() и связать поля модели с элементами управления на форме. Пример.
# coding=utf-8
import sys

from PySide import QtGui, QtSql, QtCore

#приложение
main=QtGui.QApplication(sys.argv)
#подключение база
dbase = QtSql.QSqlDatabase.addDatabase('QSQLITE')
#файл базы
dbase.setDatabaseName('my_db.sqlite') 
dbase.open()
query=QtSql.QSqlQuery()
#Создаем базу
query.exec_('''CREATE TABLE forms 
                (id integer PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, 
                name VARCHAR(9));''')
query.exec_('''CREATE TABLE studients 
                (id integer PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL, 
                name VARCHAR(255), 
                form_id integer,
                FOREIGN KEY (form_id ) REFERENCES forms);''')



class Form(QtGui.QWidget):
    def __init__(self, parent=None):
        # Создаем кнопки, поля, грди для работы с данными
        super(Form, self).__init__(parent)     
        self.gridLayout = QtGui.QGridLayout(self)
        self.gridLayout.setContentsMargins(5, 5, 5, 5)
        self.label = QtGui.QLabel('ID')
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.lineEdit = QtGui.QLineEdit()
        self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 2)
        self.label_2 = QtGui.QLabel('Name')
        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
        self.lineEdit_2 = QtGui.QLineEdit()
        self.gridLayout.addWidget(self.lineEdit_2, 1, 1, 1, 2)
        
        self.button_prev = QtGui.QPushButton('Prev')
        self.gridLayout.addWidget(self.button_prev, 2, 1, 1, 1)
        self.button_next = QtGui.QPushButton('Next')
        self.setLayout(self.gridLayout)
        self.gridLayout.addWidget(self.button_next, 2, 2, 1, 1) 
        self.view = QtGui.QTableView()
        self.gridLayout.addWidget(self.view, 3, 1,1,2)
        self.bind_data()
        
    def bind_data(self):
        #типа DBGird
        
        #типа Tabel
        self.model = QtSql.QSqlTableModel()
        self.model.setTable('forms')
        
        self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)
        #Связываем грид с таблицой
        self.view.setModel(self.model)
        
        self.data_mapper = QtGui.QDataWidgetMapper()
        # связиваем мапер с таблицой
        self.data_mapper.setModel(self.model)
        #Связываем поля
        self.data_mapper.addMapping(self.lineEdit, 0)
        self.data_mapper.addMapping(self.lineEdit_2, 1)
        self.model.select()
        self.data_mapper.toFirst()
        
        # переход между записями по книпкам
        self.connect(self.button_next, QtCore.SIGNAL('clicked()'), self.data_mapper.toNext)
        self.connect(self.button_prev, QtCore.SIGNAL('clicked()'), self.data_mapper.toPrevious)
        
my_win = Form()
my_win.show()
sys.exit(main.exec_())
Вот то что должно получится в итоге.


Редактируем тему Eclipse Juno для XP

После закачки, распаковки, и запуска нового Eclipse Juno увидел что новая тема программы не совсем соответствует стилю Windows XP.
Пошлость поковыряется в свойствах стиля. И так мы имеем в папке plugins\org.eclipse.platform_4.2...\css\ файлs стилей Eclipse, открываем один из файл e4_default_winxp_blu.css и приводим его в следующий вид.
@import url("e4_basestyle.css");

.MTrimmedWindow { 
  background-color: #F0ECE0; 
}

.MPartStack {
 font-size: 9;
 swt-simple: true;
 swt-mru-visible: false;
}

.MTrimBar {
    background-color: #F0ECE0; 
}


.MTrimBar#org-eclipse-ui-main-toolbar  {
    background-color: #EBE6DC #F0ECE0;
}

.MToolControl.TrimStack {
 frame-image:  url(./winXPBluTSFrame.png);
 handle-image:  url(./winXPBluHandle.png);
}

.MPartStack.active {
 swt-unselected-tabs-color: #EBE6DC #F0ECE0 #FFFFFF 100% 100%;
    swt-outer-keyline-color: #B8C7E5;
}

#PerspectiveSwitcher  {
 background-color: #F5F3ED #F0ECE0 100%;
 eclipse-perspective-keyline-color: #7F91B5 #7F91B5;
}

#org-eclipse-ui-editorss {
   swt-tab-renderer: url('bundleclass://org.eclipse.e4.ui.workbench.renderers.swt/org.eclipse.e4.ui.workbench.renderers.swt.CTabRendering');
   swt-unselected-tabs-color: #F0F0F0 #F0F0F0 #F0F0F0 100% 100%;
   swt-outer-keyline-color: #B4B4B4;
   swt-inner-keyline-color: #F0F0F0;
   swt-tab-outline: #F0F0F0;
   color: #F0F0F0;
   swt-tab-height: 8px;
   padding: 0px 5px 7px;
}

CTabFolder.MArea .MPartStack, CTabFolder.MArea .MPartStack.active {
   swt-shadow-visible: false;
}

CTabFolder Canvas {
  background-color: #F8F8F8;
}
Далее выбираем Window-> Preferences->General->Appearance выставляем Theme равным Windows XP Blue. Вот результат.
UPD: Есть E4 Toos которым можно редактировать CSS стиль среды непосредственно на странице настроек(работает не очень стабильно). http://habrahabr.ru/post/147417/

27 июня 2012 г.

Eclipse 4.2 Juno

Как и любой другой ленивый программист люблю пользоваться умными и удобными инструментами. Сегодня состоялся очередной ежегодный релиз Eclipse. Но пока нет доступа для прямого скачивание дистрибутива из зеркал Eclipse Foundatin. Скачивание пока доступно
Так называемым друзьям Eclipse. Ну а для всех остальных торренты.

5 июня 2012 г.

PySide 1.1.1

Наконецто появилась сборка 1.1.1 под Windows. На момент релиза этой версии на официальном сейте не имелось сборок для Windows и MacOS.
http://releases.qt-project.org/pyside/1.1.1/

2 мая 2012 г.

ActionLinq имплементация языка запросов LINQ для ActionScript.

Многие наверно читали или слышали про язык запросов LINQ.
Это чрезвычайно удобное средства обработки данных. По удобству использование не уступающий и иногда даже немного превосходящий старый добрый SQL. Собственно, почему я это пишу.
Несколько месяцев назад мне нужно было, как то сгруппировать и обработать данные в массиве внутри Flex ActionScript приложения. Но я не хотел обрабатывать объекты просто перебирая их в цикле. И я тогда нашел ActionLinq.
Итак, ActionLinq это практически полная имплементация языка запросов LINQ для ActionScript.
Вот простой пример
package
{
 import flash.display.Sprite;
 import System.Collection.Generic.IGrouping;
 import System.Linq.Enumerable;
 
 /**
  * ...
  * @author ami...[at]mail.ru
  */
 public class AcLinq extends Sprite
 {
  
  public function AcLinq()
  {
   var data:Array = [ { name: "Сергей", age: 20, city: "Москва" }, 
          { name: "Максим", age: 21, city: "Москва" }, 
          { name: "Володя", age: 25, city: "Минск" }, 
          { name: "Сергей", age: 19, city: "Минск" } ];
   
   var new_data:Array = Enumerable.from(data).groupBy(function(name:Object):String
    {
     return name.name;
    }, 
    function(values:Object):Object
    {
     return {age: values.age, city: values.city};
    }, 
    function(name:String, vals:IGrouping):Object
    {
     return { name: name, count:vals.count() };
    }).toArray();
    
    /*
     * А получаем мы в итоге нечто вроде
     * Сергей, 2
     * Володя, 1 
     * Максим, 1*/
    
    trace(new_data);
     
  }
 
 }

}
А самым удобным является что внутри конструкций function() можно определять любые стандартные операторы и конструкции ActionScript и возвращать нужные значения.
На странице wiki  ActionLinq можно прочитать, что поддерживаются многие операторы LINQ. Там же есть кое какие примеры . Так же если хотите больше примеров рекомендую посмотреть на юнит тесты проекта.

8 марта 2012 г.

Spyder среда разработки Python

Мощная среда разработки Spyder имеет функции автодополнения, интроспекции, Анализатор исходного кода. Также имеет Функции профилировшика отладки. Есть возможность непосредственного использования консоли IPython прямо из программы и просмотра документации pydoc. Программа использует библиотеки PyQt или PySide.